;********************************************************************* ; Playpal (SMS/GG thing on a chip) port manipulator. ; ; WLA DX syntax ;banking setup .memorymap defaultslot 0 slotsize $8000 slot 0 $0000 .endme .rombankmap bankstotal 1 banksize $8000 banks 1 .endro ;ram ;$c000 reserved .define oldjoy $c001 ;Last frame's joystick status .define modport $c002 ;port to modify in the 'port manipulator' .define modbit $c003 ;helpful definitions .define VRAMRW %00000000 .define VRAM %01000000 .define VREG %10000000 .define CRAM %11000000 .define NAMETBL $38 .define vc $bf ;vdp control port .define vd $be ;vdp data port .define vr1 $81 .define JOYSTICK $DC .define JUP 1 .define JDOWN 2 .define JLEFT 4 .define JRIGHT 8 .define JB1 $10 .define JB2 $20 .bank 0 slot 0 .org $0000 di ; disable interrupts im 1 ; Interrupt mode 1 jp Init .org $0066 ;pause interrupt vector push af push bc ld a,[modbit] ld b,a ld a,[modport] ld c,a in a,[c] xor b out [c],a pop bc pop af retn Init ld sp,$dff0 ld hl,Vdpdata ;load init data into vdp registers.. ld b,18 ld c,vc otir ld a,0 ;set vram address out [vc],a ld a,VRAM out [vc],a ld bc,$4000 ;clear vram.. ld a,0 Clrvram out [vd],a dec c jp nz,Clrvram dec b jp nz,Clrvram ld a,0 ;load palette.. out [vc],a ld a,CRAM out [vc],a ld hl,Palette ld b,3 ld c,vd otir ld a,$90 ;set a few things ld [modport],a ld a,1 ld [modbit],a ld a,0 ;load font tiles.. out [vc],a ld a,VRAM out [vc],a ld hl,Fontdata ld bc,Fontdataend-Fontdata Writetiles ld a,[hl] out [vd],a ld a,0 out [vd],a out [vd],a out [vd],a inc hl dec c jp nz,Writetiles dec b jp nz,Writetiles ld b,8 - ld a,0 out [vd],a ld a,$ff out [vd],a ld a,0 out [vd],a out [vd],a djnz - ld a,0 out [vc],a ld a,VRAM|NAMETBL out [vc],a ld hl,Background Printbg ld a,[hl] cp 0 jp z,Redbar sub $20 out [vd],a ld a,00 out [vd],a inc hl jp Printbg Redbar ld a,160 out [vc],a ld a,VRAM|NAMETBL out [vc],a ld b,14 - ld a,128 call Printchar djnz - Portstart ld a,0 ld ($c000),a ; First column of data. ld hl,Ports ld a,$c8 out [vc],a ld a,$78 out [vc],a ld de,$78c8 jp Portdata Portstart2 ld a,1 ld ($c000),a ; Second column of data. ld hl,Ports2 ld a,$18 out [vc],a ld a,$7b out [vc],a ld de,$7b18 Portdata ld a,[hl] cp 0 jp z,Doneports call HEXASC ld a,b call Printchar ld a,c call Printchar ld a,$3a ; $20 gets subtracted from this. call Printchar ld c,[hl] in a,[c] call HEXASC ld a,b call Printchar ld a,c call Printchar push hl ld h,d ld l,e ld de,$40 add hl,de ld a,l out [vc],a ld a,h out [vc],a ld d,h ld e,l pop hl inc hl jp Portdata ; Choose which column of port data to show. Doneports ld a,($c000) cp 0 jp z,Portstart2 cp 1 jp z,Ramstart ; Show the RAM data. Ramstart ld hl,RAM ld a,$a8 out [vc],a ld a,$7b out [vc],a ld de,$7ba8 Ramdata ;in a,($00) ld a,[hl] cp 0 jp nz,+ inc hl ld a,[hl] ; Check if both bytes are 0. cp 0 jp z,Portmanip dec hl ld a,[hl] +:call HEXASC ld a,b call Printchar ld a,c call Printchar inc hl ; Second byte of address. ld a,[hl] call HEXASC ld a,b call Printchar ld a,c call Printchar dec hl ld a,$3a call Printchar in a,($00) ld a,[hl] ld b,a inc hl ld a,[hl] ld c,a push hl ld h,b ld l,c ld a,[hl] pop hl call HEXASC ld a,b call Printchar ld a,c call Printchar push hl ld h,d ld l,e ld de,$40 add hl,de ld a,l out [vc],a ld a,h out [vc],a ld d,h ld e,l pop hl inc hl jp Ramdata Portmanip ld a,108 out [vc],a ld a,VRAM|NAMETBL + 1 out [vc],a ld a,[modport] call HEXASC ld a,b call Printchar ld a,c call Printchar ld a,230 out [vc],a ld a,VRAM|NAMETBL + 1 out [vc],a ld a,[modport] ld c,a in a,[c] call HEXASC ld a,b call Printchar ld a,c call Printchar ld a,106 out [vc],a ld a,VRAM|NAMETBL + 2 out [vc],a ld a,[modport] ld c,a in a,[c] ld c,a ld b,8 - rlc c ;draw binary ld a,$30 ;0 jp nc,+ ld a,$31 ;1 + call Printchar djnz - ld a,170 out [vc],a ld a,VRAM|NAMETBL + 2 out [vc],a ld a,[modbit] ld c,a ld b,8 ld e,1 - rrc e ld a,e cp c jp nz,+ ld a,94 call Printchar + ld a,32 call Printchar djnz - ld a,%11000100 out [vc],a ld a,vr1 out [vc],a ;jp Portstart Joystick ld a,[oldjoy] ld b,a in a,JOYSTICK cp b jp z,Portstart ;joystick hasn't changed since last read ld [oldjoy],a in a,JOYSTICK and JUP jp nz,+ ld a,[modport] inc a ld [modport],a jp Portstart + in a,JOYSTICK and JDOWN jp nz,+ ld a,[modport] dec a ld [modport],a jp Portstart + in a,JOYSTICK and JRIGHT + JB1 jp nz,+ ld a,[modport] ld c,a in a,[c] inc a out [c],a jp Portstart + in a,JOYSTICK and JLEFT + JB1 jp nz,+ ld a,[modport] ld c,a in a,[c] dec a out [c],a jp Portstart + in a,JOYSTICK and JRIGHT + JB2 jp nz,+ ld a,[modport] ld c,a in a,[c] add a,$10 out [c],a jp Portstart + in a,JOYSTICK and JLEFT + JB2 jp nz,+ ld a,[modport] ld c,a in a,[c] sub $10 out [c],a jp Portstart + in a,JOYSTICK and JRIGHT jp nz,+ ld a,[modbit] rrca ld [modbit],a jp Portstart + in a,JOYSTICK and JLEFT jp nz,+ ld a,[modbit] rlca ld [modbit],a jp Portstart + jp Portstart Printchar sub $20 out [vd],a ld a,0 out [vd],a ret ;text print subroutine ;hl = start of ascii string Writetext ld a,[hl] cp 0 ret z sub $20 out [vd],a ld a,00 out [vd],a inc hl jp Writetext ;************************************************************************ ;* HEX -> ASCII * ;* * ;************************************************************************ ;* IN:A=HEX Data * ;* OUT:C=ASCII Up,B=ASCII Down * ;************************************************************************ HEXASC: PUSH DE PUSH HL LD C,A AND $F0 RLCA RLCA RLCA RLCA LD D,0 LD E,A LD HL,ASCTBL ADD HL,DE LD B,(HL) LD A,C AND $0F LD D,0 LD E,A LD HL,ASCTBL ADD HL,DE LD C,(HL) POP HL POP DE RET ASCTBL: .DB "0123456789ABCDEF" ; VDP initialisation data Vdpdata .db $04,$80,$84,$81,$ff,$82,$ff,$85,$ff,$86,$ff,$87,$00,$88,$00,$89,$ff,$8a Palette .db $00,$3f,$03 ; Black, White, red Fontdata .include "font.inc" Fontdataend Ports .db $61,$62,$63,$86,$87,$88,$89,$8A,$8B,$8c,$8d,$8e,$8f,$90,$91,$92,$93,$94,$A0,0 Ports2 .db $A1,$A2,$A3,$C8,$DE,$DF,$DC,0 RAM .db $C0,$10,$3F,$F9,$ff,$ff,$C0,2,0,0 ; Terminate with TWO zeros! Background .db "##### Playpal Port Prober #####" .db "# #" .db "# IO MONITOR #" .db "# ??:?? #" .db "# ??:?? IO MANIPULATOR #" .db "# ??:?? Address: #" .db "# ??:?? #" .db "# ??:?? Byte: #" .db "# ??:?? #" .db "# ??:?? Binary: #" .db "# ??:?? #" .db "# ??:?? #" .db "# ??:?? RAM #" .db "# ??:?? MONITOR #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# ??:?? ??:?? ????:?? #" .db "# #" .db "################################",0