0800 1 ; SMALL BOOTSTRAP CLIENT FOR APL2SERIAL 0800 2 ; 0800 3 ; COPYRIGHT 1998 WARREN TOOMEY 0800 4 ; wkt@tuhs.org 0800 5 ; 0800 6 ; See http://minnie.tuhs.org/Programs/Apl2serial 0800 7 ; 0800 8 ; 0300 9 ORG $300 0300 10 OBJ $300 0300 11 ; C063 12 PB2 EQU $C063 ; PUSH BUTTON 2 INPUT 00FF 13 CHAR EPZ $FF 0300 14 ; 0300 15 ; 0300 16 ; GETCODE: GET APL2SERIAL CLIENT 0300 A2 00 17 GETCODE LDX #$00 0302 20 18 03 18 ^1 JSR GETB2 0305 9D 00 9B 19 STA $9B00,X 0308 E8 20 INX 0309 D0 F7 21 BNE <1 030B 22 ; 030B 23 ; 78 CYCLE DELAY, INCLUDING 030B 24 ; JSR/RTS INTO THE ROUTINE 030B 25 ; 030B 20 14 03 26 DELAY JSR RTS2 030E 20 14 03 27 JSR RTS2 0311 20 17 03 28 JSR RTS 0314 20 17 03 29 RTS2 JSR RTS 0317 60 30 RTS RTS 0318 31 ; 0318 32 ; 0318 33 ; GETB2: GET A BYTE AT 9600 FROM 0318 34 ; PUSHBUTTON 2 INPUT 0318 35 ; 0318 A0 07 36 GETB2 LDY #$07 ; LOOP 8 TIMES 031A AD 63 C0 37 ^1 LDA PB2 ; FIRST FIND A RISING EDGE 031D 30 FB 38 BMI <1 031F AD 63 C0 39 ^2 LDA PB2 0322 10 FB 40 BPL <2 ; IT'S THE START BIT 0324 20 0B 03 41 JSR DELAY ; SKIP START BIT AND 0327 20 0B 03 42 JSR DELAY ; HALF OF DATA BIT 032A AD 63 C0 43 ^3 LDA PB2 ; GET BIT'S VALUE 032D 0A 44 ASL 032E 66 FF 45 ROR CHAR ; AND SAVE IN CHAR 0330 20 0B 03 46 JSR DELAY ; NOW SKIP TO NEXT BIT 0333 88 47 DEY 0334 10 F4 48 BPL <3 ; LOOP 8 TIMES 0336 A5 FF 49 LDA CHAR 0338 49 FF 50 EOR #$FF ; INVERT THE CHARACTER 033A 60 51 RTS ; AND RETURN IT 033B 52 ; 033B 53 ; 033B 54 ; 033B 55 ; 033B 56 ; GETCHAR: GET A KEYBOARD CHAR 033B 20 18 03 57 GETCHAR JSR GETB2 033E 09 80 58 ORA #$80 0340 60 59 RTS 0341 60 ; 0341 61 ; 0341 62 ; CONNECT SERIAL LINE AS KEYBOARD 0341 A9 3B 63 SERKYBD LDA #GETCHAR 0343 85 38 64 STA $38 0345 A9 03 65 LDA /GETCHAR 0347 85 39 66 STA $39 0349 4C EA 03 67 JMP $3EA 034C 68 END Hexdump of above code: 0300- A2 00 20 18 03 9D 00 9B 0308- E8 D0 F7 20 14 03 20 14 0310- 03 20 17 03 20 17 03 60 0318- A0 07 AD 63 C0 30 FB AD 0320- 63 C0 10 FB 20 0B 03 20 0328- 0B 03 AD 63 C0 0A 66 FF 0330- 20 0B 03 88 10 F4 A5 FF 0338- 49 FF 60 20 18 03 09 80 0340- 60 A9 3B 85 38 A9 03 85 0348- 39 4C EA 03 0800 1 ; APL2SERIAL 9600 CLIENT V1.9 OCT 1998 0800 2 ; BY Warren Toomey wkt@tuhs.org 0800 3 ; 0800 4 ; SIMULATE 9600BPS SERIAL PORT WITH 0800 5 ; PUSH-BUTTON 2 AND ANNUNCIATOR 0. 0800 6 ; SIMULATE 14 FLOPPY DISKS WITH REMOTE 0800 7 ; DISK SERVER CONNECTED BY SERIAL PORT. 0800 8 ; 0800 9 ; See http://minnie.tuhs.org/Programs/Apl2serial 0800 10 ; 9B00 11 ORG $9B00 9B00 12 OBJ $800 9B00 13 ; C058 14 ANNOFF EQU $C058 ; ANN0 OFF C059 15 ANNON EQU $C059 ; ANN0 ON C063 16 PB2 EQU $C063 ; PUSH BUTTON 2 INPUT 9B00 17 ; BD04 18 RWTS2 EQU $BD04 ; 2ND ENTRY POINT 9B00 19 ; 003E 20 BUF EPZ $3E 0048 21 IOB EPZ $48 00FE 22 LASTBIT EPZ $FE 00FF 23 CHAR EPZ $FF 9B00 24 ; 9B00 25 ; CONSTANTS 9B00 26 ; 0001 27 SLOT EPZ $01 0002 28 DISK EPZ $02 0004 29 TRK EPZ $04 0005 30 SCT EPZ $05 0008 31 BUFLO EPZ $08 000C 32 CMD EPZ $0C 000D 33 ERROR EPZ $0D 9B00 34 ; 0000 35 NULLCMD EPZ $00 0001 36 READCMD EPZ $01 0002 37 WRITECMD EPZ $02 0004 38 FRMATCMD EPZ $04 9B00 39 ; 0010 40 PROTERR EPZ $10 0020 41 VOLERR EPZ $20 0040 42 DRVERR EPZ $40 0080 43 READERR EPZ $80 9B00 44 ; 9B00 45 ; 9B00 4C 6C 9B 46 JUMP JMP MYRWTS ; ALWAYS AT $9B00 9B03 4C 40 9B 47 JUMP2 JMP SENDBYTE ; FOR APLL2DUMP 9B06 48 ; 9B06 49 ; 9B06 50 ; GETBYTE: GET A BYTE FROM PB2 9B06 51 ; AT 9600 BPS, RETURN IN A-REG 9B06 52 ; 9B06 8A 53 GETBYTE TXA ; SAVE X-REG 9B07 48 54 PHA 9B08 A2 07 55 LDX #$07 ; LOOP 8 TIMES 9B0A AD 63 C0 56 ^1 LDA PB2 ; FIRST FIND A RISING EDGE 9B0D 30 FB 57 BMI <1 9B0F AD 63 C0 58 ^2 LDA PB2 9B12 10 FB 59 BPL <2 ; ITS THE START BIT 9B14 20 2D 9B 60 JSR DELAY84 ; SKIP START BIT AND 9B17 20 2D 9B 61 JSR DELAY84 ; HALF OF DATA BIT 9B1A AD 63 C0 62 ^3 LDA PB2 ; GET BITS VALUE 9B1D 0A 63 ASL 9B1E 66 FF 64 ROR CHAR ; AND SAVE IN CHAR 9B20 20 2D 9B 65 JSR DELAY84 ; NOW SKIP TO NEXT BIT 9B23 CA 66 DEX 9B24 10 F4 67 BPL <3 ; LOOP 8 TIMES 9B26 68 68 PLA ; GET X-REG BACK 9B27 AA 69 TAX 9B28 A5 FF 70 LDA CHAR 9B2A 49 FF 71 EOR #$FF ; INVERT THE CHAR 9B2C 60 72 RTS ; AND RETURN IT 9B2D 73 ; 9B2D 74 ; AN 84 CYCLE DELAY, INCLUDING 9B2D 75 ; THE JSR/RTS INTO THE ROUTINE 9B2D 76 ; 9B2D 20 3F 9B 77 DELAY84 JSR RTS 9B30 20 3F 9B 78 JSR RTS 9B33 20 3F 9B 79 JSR RTS 9B36 20 3F 9B 80 JSR RTS 9B39 20 3F 9B 81 JSR RTS 9B3C 20 3F 9B 82 DELAY24 JSR RTS 9B3F 60 83 RTS RTS 9B40 84 ; 9B40 85 ; 9B40 86 ; SENDBYTE: SEND THE BYTE IN A-REG 9B40 87 ; VIA ANNUNCIATOR 0 AT 9600 BAUD 9B40 88 ; 9B40 86 FF 89 SENDBYTE STX CHAR ; SAVE X-REG 9B42 A2 07 90 LDX #$07 ; LOOP 8 TIMES 9B44 8D 59 C0 91 STA ANNON ; TURN START BIT ON 9B47 20 2D 9B 92 JSR DELAY84 ; DELAY FOR 106 CYCLES 9B4A 20 3C 9B 93 JSR DELAY24 9B4D 6A 94 ^1 ROR ; CHECK NEXT BIT 9B4E B0 05 95 BCS >2 9B50 8D 59 C0 96 STA ANNON ; WAS 0, TURN PORT ON 9B53 90 05 97 BCC >3 9B55 8D 58 C0 98 ^2 STA ANNOFF ; WAS 1, TURN PORT OFF 9B58 B0 00 99 BCS >3 9B5A 20 2D 9B 100 ^3 JSR DELAY84 ; DELAY FOR 106 CYCLES 9B5D CA 101 DEX 9B5E 10 ED 102 BPL <1 9B60 8D 58 C0 103 STA ANNOFF ; NOW DO STOP BIT 9B63 20 2D 9B 104 JSR DELAY84 9B66 20 3C 9B 105 JSR DELAY24 9B69 A6 FF 106 LDX CHAR ; RELOAD X-REG 9B6B 60 107 RTS ; AND RETURN 9B6C 108 ; 9B6C 109 ; 9B6C 110 ; THE REAL RWTS AT $B7B7 TO JSR 9B6C 111 ; MYRWTS 9B6C 112 ; 9B6C 113 ; 9B6C 84 48 114 MYRWTS STY IOB 9B6E 85 49 115 STA IOB+1 9B70 A0 01 116 LDY #SLOT 9B72 B1 48 117 LDA (IOB),Y 9B74 C9 60 118 CMP #$60 ; SLOT 6? 9B76 D0 03 119 BNE >1 ; NO, WE HANDLE IT 9B78 4C 04 BD 120 JMP RWTS2 ; ELSE USE REAL ONE 9B7B 121 ; 9B7B A0 08 122 ^1 LDY #BUFLO ; SET UP THE BUFFER PTR 9B7D B1 48 123 LDA (IOB),Y 9B7F 85 3E 124 STA BUF 9B81 C8 125 INY 9B82 B1 48 126 LDA (IOB),Y 9B84 85 3F 127 STA BUF+1 9B86 A9 03 128 LDA #$03 ; SEND DOS3.3 ID 9B88 20 40 9B 129 JSR SENDBYTE 9B8B A0 01 130 LDY #SLOT 9B8D B1 48 131 LDA (IOB),Y ; SEND SLOT 9B8F 20 40 9B 132 JSR SENDBYTE 9B92 C8 133 INY 9B93 B1 48 134 LDA (IOB),Y ; SEND DRV 9B95 20 40 9B 135 JSR SENDBYTE 9B98 C8 136 INY 9B99 C8 137 INY 9B9A B1 48 138 LDA (IOB),Y ; SEND TRACK 9B9C 20 40 9B 139 JSR SENDBYTE 9B9F C8 140 INY 9BA0 B1 48 141 LDA (IOB),Y ; SEND SECTOR 9BA2 20 40 9B 142 JSR SENDBYTE 9BA5 A0 0C 143 LDY #CMD 9BA7 B1 48 144 LDA (IOB),Y ; SEND COMMAND 9BA9 48 145 PHA 9BAA 20 40 9B 146 JSR SENDBYTE 9BAD 68 147 PLA 9BAE C9 01 148 CMP #READCMD 9BB0 F0 33 149 BEQ READ 9BB2 C9 02 150 CMP #WRITECMD 9BB4 F0 23 151 BEQ WRITE 9BB6 C9 04 152 CMP #FRMATCMD 9BB8 F0 0F 153 BEQ NULL 9BBA C9 00 154 CMP #NULLCMD 9BBC F0 0B 155 BEQ NULL 9BBE A9 40 156 ERR1 LDA #DRVERR ; SET GENERIC ERROR 9BC0 38 157 ERR2 SEC ; AND CARRY FLAG 9BC1 B0 01 158 BCS >2 9BC3 18 159 NOERR CLC ; NO ERROR IF THRU HERE 9BC4 A0 0D 160 ^2 LDY #ERROR 9BC6 91 48 161 STA (IOB),Y ; SAVE RESULT 9BC8 60 162 RTS ; AND RETURN 9BC9 163 ; 9BC9 20 06 9B 164 NULL JSR GETBYTE ; GET BACK AN ID BYTE 9BCC C9 03 165 CMP #$03 ; DOS 3.3? 9BCE D0 EE 166 BNE ERR1 ; NOPE, GENERAL ERR 9BD0 20 06 9B 167 JSR GETBYTE ; GET RESULT 9BD3 C9 00 168 CMP #$00 ; AN ERROR? 9BD5 D0 E9 169 BNE ERR2 ; YES, SAVE IT 9BD7 F0 EA 170 BEQ NOERR ; NO ERROR, RETURN 9BD9 171 ; 9BD9 A0 00 172 WRITE LDY #$00 9BDB B1 3E 173 ^3 LDA (BUF),Y ; SEND EACH BYTE 9BDD 20 40 9B 174 JSR SENDBYTE ; IN THE BUFFER 9BE0 C8 175 INY 9BE1 D0 F8 176 BNE <3 9BE3 F0 E4 177 BEQ NULL 9BE5 178 ; 9BE5 20 06 9B 179 READ JSR GETBYTE ; GET ID AS PER 9BE8 C9 03 180 CMP #$03 ; NULL ABOVE 9BEA D0 D2 181 BNE ERR1 9BEC 20 06 9B 182 JSR GETBYTE ; GET RESULT 9BEF C9 00 183 CMP #$00 ; BAD RESULT 9BF1 D0 CD 184 BNE ERR2 ; YES 9BF3 A0 00 185 LDY #$00 ; OK, GET BUFFER 9BF5 20 06 9B 186 ^4 JSR GETBYTE 9BF8 91 3E 187 STA (BUF),Y 9BFA C8 188 INY 9BFB D0 F8 189 BNE <4 9BFD 98 190 TYA ; A=00 9BFE F0 C3 191 BEQ NOERR ; AND RETURN 9C00 192 END Hexdump of above code, note code goes at $9B00 not $0800: 0800- 4C 6C 9B 4C 40 9B 8A 48 0808- A2 07 AD 63 C0 30 FB AD 0810- 63 C0 10 FB 20 2D 9B 20 0818- 2D 9B AD 63 C0 0A 66 FF 0820- 20 2D 9B CA 10 F4 68 AA 0828- A5 FF 49 FF 60 20 3F 9B 0830- 20 3F 9B 20 3F 9B 20 3F 0838- 9B 20 3F 9B 20 3F 9B 60 0840- 86 FF A2 07 8D 59 C0 20 0848- 2D 9B 20 3C 9B 6A B0 05 0850- 8D 59 C0 90 05 8D 58 C0 0858- B0 00 20 2D 9B CA 10 ED 0860- 8D 58 C0 20 2D 9B 20 3C 0868- 9B A6 FF 60 84 48 85 49 0870- A0 01 B1 48 C9 60 D0 03 0878- 4C 04 BD A0 08 B1 48 85 0880- 3E C8 B1 48 85 3F A9 03 0888- 20 40 9B A0 01 B1 48 20 0890- 40 9B C8 B1 48 20 40 9B 0898- C8 C8 B1 48 20 40 9B C8 08A0- B1 48 20 40 9B A0 0C B1 08A8- 48 48 20 40 9B 68 C9 01 08B0- F0 33 C9 02 F0 23 C9 04 08B8- F0 0F C9 00 F0 0B A9 40 08C0- 38 B0 01 18 A0 0D 91 48 08C8- 60 20 06 9B C9 03 D0 EE 08D0- 20 06 9B C9 00 D0 E9 F0 08D8- EA A0 00 B1 3E 20 40 9B 08E0- C8 D0 F8 F0 E4 20 06 9B 08E8- C9 03 D0 D2 20 06 9B C9 08F0- 00 D0 CD A0 00 20 06 9B 08F8- 91 3E C8 D0 F8 98 F0 C3