E000 FCB $A,$D E002 FCC '+++ Mon09 Ver 4.23 Micro-Concepts 1984 +++' E02D FCB $04,$0A,$0D E030 FCC '=>',$04 E033 FCC $07,$20,'Unknown command! ',$04 E047 FCB $7,$7,$7,$7,$7,$7,$7,$7,$7,$7 E051 FCC 'UNEXPECTED INTERUPT!!!!!!!!!!',4 entered by a jump at F0D6. This is part-2 of the RESET routine. E06F BF DF98 STX RNDM ; E072 C6 0D LDB #$0D ; E074 BD F5C1 JSR GETRTC ;read D-reg E077 84 80 ANDA #$80 ;mask off bit 0-6 E079 B7 DFB5 STA RTCFAIL ;=0 if no power E07C B6 FF02 LDA SYSREG ;eg.%01110111 E07F 43 COMA ;eg.%10001000 E080 C6 0E LDB #$0E ;adr.config.switch E082 BD F5DF JSR PUTRTC ;store it E085 44 LSRA ;look at Hi nibble E086 44 LSRA ; E087 44 LSRA ; E088 44 LSRA ; E089 1F89 TFR A,B ;copy to B E08B C4 01 ANDB #$01 ;lsb=initial input E08D F7 DF8C STB IPORT ;store it. E090 1F89 TFR A,B ;recover nibble E092 54 LSRB ;get initial output E093 C4 01 ANDB #$01 ; E095 F7 DF8D STB OPORT ;store it E098 1F89 TFR A,B ;recover nibble E09A 54 LSRB ;get step rate E09B 54 LSRB ; E09C C4 01 ANDB #$01 ; E09E F7 DFF6 STB STEP ;store it E0A1 27 05 BEQ $E0A8 ;if set,then E0A3 C6 03 LDB #$03 ; E0A5 F7 DFF6 STB STEP ;set STEP=3 E0A8 F7 FF10 STB COMREG ;(FDC cmd. reg.) first access following reset addresses mode register. E0AB 86 CE LDA #$CE ; 2 stop bits,no parity,8 bits,baud rate factor=X16. E0AD B7 FF09 STA ACIAC1 ; E0B0 B7 FF05 STA ACIAC2 ; now addressing command register. E0B3 86 27 LDA #$27 ; enable reciever & transmitter,address baud rate register. E0B5 B7 FF09 STA ACIAC1 ; E0B8 B7 FF05 STA ACIAC2 ; E0BB 7D DFB5 TST RTCFAIL ;RTC data valid ? E0BE 27 11 BEQ $E0D1 ;no,branch to default. E0C0 C6 0F LDB #$0F ;else,get baud rates. E0C2 BD F5C1 JSR GETRTC ; E0C5 B7 FF0C STA BAUD1 ;and store them. E0C8 44 LSRA ; E0C9 44 LSRA ; E0CA 44 LSRA ; E0CB 44 LSRA ; E0CC B7 FF0D STA BAUD2 ; E0CF 20 0F BRA $E0E0 ; E0D1 86 0E LDA #$0E ;set default rates. E0D3 B7 FF0C STA BAUD1 ;9600 baud E0D6 B7 FF0D STA BAUD2 ;9600 baud E0D9 86 EE LDA #$EE ;and store E0DB C6 0F LDB #$0F ;them in RTC. E0DD BD F5DF JSR PUTRTC ; E0E0 BD F8AA JSR GDCINI ; E0E3 86 9B LDA #$9B ;init 8255A pia E0E5 B7 FF1F STA BITCON ;(eprom disc) load disc drive table,from RTC if data valid,else defaults. E0E8 C6 10 LDB #$10 ; E0EA 8E DF9D LDX #DDSTAB ; E0ED 7D DFB5 TST RTCFAIL ; E0F0 27 0C BEQ $E0FE ; E0F2 BD F5C1 JSR GETRTC ; E0F5 A7 80 STA 0,X+ ; E0F7 5C INCB ; E0F8 C1 14 CMPB #$14 ; E0FA 26 F6 BNE $E0F2 ; E0FC 20 5A BRA $E158 ; E0FE 4F CLRA ; E0FF BD F5DF JSR PUTRTC ; E102 A7 80 STA 0,X+ ; E104 5C INCB ; E105 4C INCA ; E106 BD F5DF JSR PUTRTC ; E109 A7 80 STA 0,X+ ; E10B 5C INCB ; E10C 4A DECA ; E10D 4A DECA ; E10E BD F5DF JSR PUTRTC ; E111 A7 80 STA 0,X+ ; E113 5C INCB ; E114 BD F5DF JSR PUTRTC ; E117 A7 80 STA 0,X+ ; if RTC data not valid,load TTYSET & ASN defaults and send power failure warning message. E119 7D DFB5 TST RTCFAIL ; E11C 26 3A BNE $E158 ; E11E 8E E135 LDX #$E135 ; E121 C6 14 LDB #$14 ; E123 A6 80 LDA 0,X+ ; E125 BD F5DF JSR PUTRTC ; E128 5C INCB ; E129 C1 21 CMPB #$21 ; E12B 26 F6 BNE $E123 ; E12D 8E E142 LDX #$E142 ; E130 BD F505 JSR PSTRNG ; E133 20 23 BRA $E158 ; E135 FCB 08,00,3A,18,50,00,00,00,00,59,1B ;TTYSET defaults. E140 FCB 00,00 ;ASN defaults. E142 FCC 'Power failure in RTC.',4 E158 B6 FF02 LDA SYSREG ; E15B 43 COMA ; E15C 102B 012F LBMI $E28F ;(BO command) E160 7E F0D9 JMP CONTRL ; Jump table for Monitor commands E163 FCB 'A,'D,$E5,$4A E167 FCB 'H,'D,$E5,$EB E16B FCB 'D,'R,$E7,$5C E16F FCB 'S,'B,$ED,$FA E173 FCB 'S,'I,$E2,$2A E177 FCB 'S,'O,$E2,$50 E17B FCB 'C,'D,$E4,$07 E17F FCB 'R,'P,$E4,$7C E183 FCB 'J,'U,$E1,$E5 E187 FCB 'J,'F,$E2,$0A E18B FCB 'C,'P,$E4,$5D E18F FCB 'M,'E,$E6,$E2 E193 FCB 'P,'M,$E6,$47 E197 FCB 'L,'K,$E6,$89 E19B FCB 'S,'M,$E7,$B1 E19F FCB 'F,'M,$E4,$89 E1A3 FCB 'F,'I,$ED,$24 E1A7 FCB 'T,'M,$E8,$27 E1AB FCB 'T,'S,$EB,$FC E1AF FCB 'T,'D,$EB,$7A E1B3 FCB 'B,'O,$E2,$8F E1B7 FCB 'R,'S,$E8,$E4 E1BB FCB 'W,'S,$E9,$58 E1BF FCB 'D,'F,$E9,$EB E1C3 FCB 'B,'F,$EC,$21 E1C7 FCB 'D,'C,$EC,$41 E1CB FCB 'M,'C,$EC,$B1 E1CF FCB $FF action JU E1D0 FCC $D,'Jump to program at ',4 E1E5 8E E1D0 JU LDX #$E1D0 ; E1E8 BD F4FE JSR PDATA1 ; E1EB BD F533 JSR BADDR ; E1EE 1F15 TFR X,PC ; action JF E1F0 FCC $D,'Jump to flex warm start.',4 E20A 8E E1F0 JF LDX #$E1F0 ; E20D BD F4FE JSR PDATA1 ; E210 8E CD03 LDX #$CD03 ; E213 7E F60E JMP MAPRAM ; action SI E216 FCC $D,'Set input port to ',4 E22A 8E E216 SI LDX #$E216 ; E22D BD F4FE JSR PDATA1 ; E230 BD F563 JSR INHEX ; E233 84 03 ANDA #$03 ; E235 B7 DF8C STA IPORT ; E238 7E F0DF JMP CONTRL ; action SO E23B FCC $D,'Set output port to '4 E250 8E E23B SO LDX #$E23B ; E253 BD F4FE JSR PDATA1 ; E256 BD F563 JSR INHEX ; E259 84 03 ANDA #$03 ; E25B B7 DF8D STA OPORT ; E25E 7E F0DF JMP CONTRL ; action BO (BOot flex from logical drive 0) E261 FCC $D,'Booting FLEX....',4 E273 FCC $A,$D,$7,'Cant find FLEX!',4 E287 FCB 'F,'L,'E,'X,0,0,0,0 Search Directory for Flex.sys E28F 8E E261 BO LDX #$E261 ;send message E292 BD F4FE JSR PDATA1 ; E295 7F DF8E CLR DRIVE ;select drive 0 E298 8E DF8B LDX #DRIVE-3 ; E29B BD F48D JSR RST ;track 0 E29E C6 05 LDB #$05 ;sector 5 E2A0 F7 DF90 STB SECTOR ; E2A3 4F CLRA ; E2A4 B7 DF8F STA TRACK ; E2A7 F6 DF90 LDB SECTOR ;(start of E2AA B6 DF8F LDA TRACK ;directory) E2AD 8E DE80 LDX #BUFFER ;point to buffer E2B0 BD F481 JSR READ ;read sector E2B3 8E DE90 LDX #BUFFER+16 ;point to 1st name E2B6 C6 0A LDB #$0A ;names per sector E2B8 108E E287 LDY #$E287 ;(compare template) E2BC 3410 PSHS X ;save adr.of name E2BE A6 80 LDA 0,X+ ;compare characters E2C0 A1 A0 CMPA 0,Y+ ; E2C2 26 0D BNE $E2D1 ;match ? E2C4 108C E28F CMPY #$E28F ;yes,all done ? E2C8 26 F4 BNE $E2BE ;no,compare next E2CA EC 05 LDD $05,X ;yes,get start adr. E2CC FD DF94 STD YTEMP ;of file & store it. E2CF 20 1D BRA $E2EE ;go and load it. E2D1 5A DECB ;no match.next name. E2D2 27 07 BEQ $E2DB ;end of sector ? E2D4 3510 PULS X ;no,recover name adr. E2D6 30 8818 LEAX $18,X ;point to next name E2D9 20 DD BRA $E2B8 ;and try again. E2DB FC DE80 LDD BUFFER ;next dir.sector E2DE 27 05 BEQ $E2E5 ;end of directory ? E2E0 FD DF8F STD TRACK ;no,update T/S adr. E2E3 20 C2 BRA $E2A7 ;and try again. E2E5 8E E273 LDX #$E273 ;yes,failed ! E2E8 BD F505 JSR PSTRNG ;send error message E2EB 7E F0DF JMP CONTRL ;and back to Mono9. Load Flex.sys E2EE FC DF94 LDD YTEMP ;(T/S adr. of file) E2F1 FD DE80 STD BUFFER ;put in buffer E2F4 108E DF80 LDY #BUFFER+256 ; E2F8 8D 34 BSR $E32E ; E2FA 81 02 CMPA #$02 ;binary record ? E2FC 27 0A BEQ $E308 ;yes,go set TTO E2FE 81 16 CMPA #$16 ;transfer addr. ? E300 26 F6 BNE $E2F8 ;cont.until 02 or 16 E302 8D 2A BSR $E32E ;it was a transfer E304 8D 28 BSR $E32E ;adr. Discard it and E306 20 F0 BRA $E2F8 ;find next record. E308 8D 24 BSR $E32E ;get load adr.Hi E30A B7 DF96 STA TTO ; E30D 8D 1F BSR $E32E ;get load adr.Lo E30F B7 DF97 STA TTO+1 ; E312 8D 1A BSR $E32E ;get byte count E314 1F89 TFR A,B ;put it in ACCB E316 5D TSTB ;if 0,end of record E317 27 DF BEQ $E2F8 ;go find next rec. E319 BE DF96 LDX TTO ;else,copy to [TTO] E31C 3414 PSHS B,X ;save count & adr. E31E 8D 0E BSR $E32E ;get a byte E320 3514 PULS B,X ;recall cnt.& adr. E322 8C DE00 CMPX #$DE00 ;skip.Microbox loads E325 22 02 BHI $E329 ;this area from tables E327 A7 80 STA 0,X+ ; E329 5A DECB ;end of record ? E32A 26 F0 BNE $E31C ;no,continue E32C 20 CA BRA $E2F8 ;yes,find next rec. This subroutine gets the next byte from the buffer into ACCA. If the buffer is empty,the next sector is first read into the buffer. If all sectors have been read,a branch to 'Read tables & Exit' occures. E32E 108C DF80 CMPY #BUFFER+256 ;buffer empty ? E332 26 10 BNE $E344 ;no,get next byte E334 8E DE80 LDX #BUFFER ;yes,read next sector E337 EC 84 LDD 0,X ;look at link adr. E339 27 0C BEQ $E347 ;no more,do tables. E33B BD F481 JSR READ ; If read error,density setting is toggled so try again. E33E 26 AE BNE $E2EE ;error if not 0 E340 108E DE84 LDY #$DE84 ;point to name E344 A6 A0 LDA 0,Y+ ;get a character E346 39 RTS ; Read Tables & Exit E347 8E D3E5 LDX #$D3E5 ;load table 1 E34A 108E E386 LDY #$E386 ; E34E EC A1 LDD 0,Y++ ; E350 ED 81 STD 0,X++ ; E352 8C D3FD CMPX #$D3FD ; E355 26 F7 BNE $E34E ; E357 8E DE00 LDX #$DE00 ;load table 2 E35A 108E E39E LDY #$E39E ; E35E EC A1 LDD 0,Y++ ; E360 ED 81 STD 0,X++ ; E362 8C DE1E CMPX #$DE1E ; E365 26 F7 BNE $E35E ; E367 86 39 LDA #$39 ; E369 B7 CA02 STA $CA02 ; E36C 7D DFB5 TST RTCFAIL ;valid data ? E36F 27 0F BEQ $E380 ;no,ignore E371 8E CC00 LDX #$CC00 ;else,copy in E374 C6 14 LDB #$14 ;TTYSET & ASN E376 BD F5C1 JSR GETRTC ;options. E379 A7 80 STA 0,X+ ; E37B 5C INCB ; E37C C1 21 CMPB #$21 ; E37E 26 F6 BNE $E376 ; E380 8E CD00 LDX #$CD00 ;select Cold Start E383 7E F60E JMP MAPRAM ;and jump to it. Table 1 E386 FDB $F153 E388 FDB $F130 E38A FDB $FFFE E38C FDB $FFFE E38E FDB $F130 E390 FDB $F130 E392 FDB $F130 E394 FDB $F0DF E396 FDB $F130 E398 FDB $F131 E39A FDB $F16E E39C FDB $F16C Table 2 E39E FCB $7E,$F4,$81 E3A1 FCB $7E,$F4,$85 E3A4 FCB $7E,$F4,$89 E3A7 FCB $7E,$F4,$8D E3AA FCB $7E,$F4,$97 E3AD FCB $7E,$F4,$C7 E3B0 FCB $7E,$F4,$CB E3B3 FCB $7E,$F4,$CF E3B6 FCB $7E,$F4,$E7 E3B9 FCB $7E,$F4,$EB action CD E3BC FCC $D,'Calculate displacement from ',4 E3DA FCC ' to ',4 E3DF FCC $D,$A,' Long or short branch (L/S)? ',4 E3FF FCC ' value ',4 E407 8E E3BC CD LDX #$E3BC ; E40A BD F4FE JSR PDATA1 ; E40D BD F533 JSR BADDR ;get 'from' E410 30 02 LEAX $02,X ;add 2 E412 3410 PSHS X ;save it E414 8E E3DA LDX #$E3DA ; E417 BD F4FE JSR PDATA1 ; E41A BD F533 JSR BADDR ;get 'to' E41D 1F12 TFR X,Y ;save in Y E41F 8E E3DF LDX #$E3DF ; E422 BD F4FE JSR PDATA1 ; E425 BD F16C JSR INCH ;get 'L/S' E428 81 4C CMPA #$4C ;was it L ? E42A 26 06 BNE $E432 ;no,branch E42C 3510 PULS X ;recall 'from' E42E 30 02 LEAX $02,X ;add 2 E430 3410 PSHS X ;save again E432 1F20 TFR Y,D ;D = 'to' E434 A3 E4 SUBD 0,S ;subtract 'from' E436 ED E4 STD 0,S ;'offset' now TOS E438 8E E3FF LDX #$E3FF ; E43B BD F4FE JSR PDATA1 ; E43E 3510 PULS X ;'offset' E440 BD F516 JSR PRINTX ; E443 7E F0DF JMP CONTRL ; action CP [There is a BUG in this routine] E446 FCC $D,'Continue from SWI....',4 E45D 8E E446 CP LDX #$E446 ; E460 BD F4FE JSR PDATA1 ; E463 6C 6B INC $0B,S ;(PC-low) E465 7E E4D6 JMP $E4D6 ;recover SP & RTI. BUG here? What if PC-low = $FF ??? why not LDX 10,S LEAX 1,X STX 10,S ie. Increment PC. action FM E468 FCC $D,'Fill memory with constant from ',4 E489 8E E468 FM LDX #$E468 ; E48C BD F4FE JSR PDATA1 ; E48F BD F533 JSR BADDR ;get 'from' E492 1F12 TFR X,Y ;save in Y E494 8E E3DA LDX #$E3DA ; E497 BD F4FE JSR PDATA1 ; E49A BD F533 JSR BADDR ;get 'to' E49D 3410 PSHS X ;save in X E49F 8E E3FF LDX #$E3FF ; E4A2 BD F4FE JSR PDATA1 ; E4A5 BD F53E JSR BYTE ;get 'value' E4A8 A7 A0 STA 0,Y+ ;fill until E4AA 10ACE4 CMPY 0,S ;from = to E4AD 26 F9 BNE $E4A8 ;then E4AF 3510 PULS X ;tidy stack E4B1 7E F0DF JMP CONTRL ; action RP E4B4 FCC $D,'Run program from ',4 E4C7 8E E4B4 RP LDX #$E4B4 ; E4CA BD F4FE JSR PDATA1 ; E4CD BD F533 JSR BADDR ;input start addr. E4D0 AF 6A STX $0A,S ;stack it as PC E4D2 86 FF LDA #$FF ; E4D4 A7 E4 STA 0,S ;stack as CC E4D6 10FE DF80 LDS STACK ;recover SP E4DA 3B RTI ;load all registers. SWI service routine E4DB 10FF DF80 STS STACK ;save SP E4DF AE 6A LDX $0A,S ;get PC E4E1 30 1F LEAX -$01,X ;decrement it E4E3 AF 6A STX $0A,S ;and put it back E4E5 7E E762 JMP $E762 ;display registers. action AD E4E8 FCC $D,'Ascii dump of memory from ',4 E504 FCC ' 0 4 8 C 0 4 8 C 0' E52A FCC ' 4 8 C 0 4 8 C F',4 E54A 8E E4E8 AD LDX #$E4E8 ; E54D BD F4FE JSR PDATA1 ; E550 BD F533 JSR BADDR ;get start addr. E553 BD F4F2 JSR PCRLF ; E556 108E 0010 LDY #$0010 ;line count E55A BD F4F2 JSR PCRLF ; E55D 3410 PSHS X ;print header E55F 8E E504 LDX #$E504 ; E562 BD F505 JSR PSTRNG ; E565 3510 PULS X ; E567 BD F4F2 JSR PCRLF ; E56A BD F516 JSR PRINTX ;print addr. E56D C6 40 LDB #$40 ;char. count E56F A6 80 LDA 0,X+ ;peek at char. E571 81 20 CMPA #$20 ;is it Ascii ? E573 2D 04 BLT $E579 ; E575 81 7F CMPA #$7F ; E577 2D 02 BLT $E57B ; E579 86 2E LDA #$2E ;no,change to dot E57B BD F16E JSR OUTCH ;else,print it E57E 5A DECB ;end of line ? E57F 27 02 BEQ $E583 ;yes,branch E581 20 EC BRA $E56F ;no,next char E583 31 3F LEAY -$01,Y ;end of page ? E585 26 E0 BNE $E567 ;no,next line E587 BD F16C JSR INCH ;input a char E58A 81 0D CMPA #$0D ;CR ? E58C 27 C8 BEQ $E556 ;yes,do another page E58E 81 2D CMPA #$2D ;a '-' ? E590 1026 0B4B LBNE CONTRL ;no,quit E594 30 89F800 LEAX -$0800,X ;yes,set old st.addr. E598 20 BC BRA $E556 ;and do another page action HD E59A FCC $D,'Hex dump of memory from ',4 E5B4 FCC ' 0 1 2 3 4 5 6 7 8 ' E5D5 FCC '9 A B C D E F ',4 E5EB 8E E59A HD LDX #$E59A ; E5EE BD F4FE JSR PDATA1 ; E5F1 BD F533 JSR BADDR ;get start addr. E5F4 BD F4F2 JSR PCRLF ; E5F7 108E 0010 LDY #$0010 ; E5FB BD F4F2 JSR PCRLF ; E5FE 3410 PSHS X ; E600 8E E5B4 LDX #$E5B4 ;print header E603 BD F505 JSR PSTRNG ; E606 3510 PULS X ; E608 BD F4F2 JSR PCRLF ; E60B BD F516 JSR PRINTX ;print address E60E C6 10 LDB #$10 ;byte counter E610 BD F58A JSR OUT2HS ;print a byte E613 5A DECB ;end of line ? E614 27 09 BEQ $E61F ;yes,branch E616 C1 08 CMPB #$08 ;half way ? E618 26 F6 BNE $E610 ;no,do another byte E61A BD F58C JSR OUTS ;yes,print a space E61D 20 F1 BRA $E610 ; E61F 31 3F LEAY -$01,Y ;end of page ? E621 26 E5 BNE $E608 ;no,do another line E623 BD F16C JSR INCH ;yes,input a char E626 81 0D CMPA #$0D ; E628 27 CD BEQ $E5F7 ;do another page E62A 81 2D CMPA #$2D ; E62C 1026 0AAF LBNE CONTRL ; E630 30 89FE00 LEAX -$0200,X ;reset st.adr. E634 20 C1 BRA $E5F7 ;do previous page action PM E636 FCC $D,'Poke memory at',4 E647 8E E636 PM LDX #$E636 ; E64A BD F4FE JSR PDATA1 ; E64D BD F533 JSR BADDR ;input addr. E650 1F12 TFR X,Y ; E652 8E E3FF LDX #$E3FF ; E655 BD F4FE JSR PDATA1 ; E658 BD F53E JSR BYTE ;input 'value' E65B A7 A4 STA 0,Y ;store at addr. E65D 7E F0DF JMP CONTRL ; action LK E660 FCC $D,'Load memory with text from keyboard to ',4 E689 8E E660 LK LDX #$E660 ; E68C BD F4FE JSR PDATA1 ; E68F BD F533 JSR BADDR ;input addr. E692 1F12 TFR X,Y ; E694 8E E3FF LDX #$E3FF ; E697 BD F4FE JSR PDATA1 ; E69A BD F16C JSR INCH ;input a character E69D A7 A0 STA 0,Y+ ;store it E69F 81 04 CMPA #$04 ;was it EOT ? E6A1 26 F7 BNE $E69A ;no,input another E6A3 7E F0DF JMP CONTRL ; action ME E6A6 FCC $D,'Memory examine and modify from ',4 E6C7 FCC $7,' No ram at that address!',4 E6E2 8E E6A6 ME LDX #$E6A6 ; E6E5 BD F4FE JSR PDATA1 ; E6E8 BD F533 JSR BADDR ;pick up addr. E6EB BD F4F2 JSR PCRLF ; E6EE BD F516 JSR PRINTX ;display addr. E6F1 BD F58A JSR OUT2HS ;and content E6F4 BD F16C JSR INCH ;input a char E6F7 81 2D CMPA #$2D ;was it a '-' ? E6F9 26 04 BNE $E6FF ;no,try CR E6FB 30 1E LEAX -$02,X ;yes,back 2 locations E6FD 20 EC BRA $E6EB ;display previous E6FF 81 0D CMPA #$0D ;was it CR ? E701 27 E8 BEQ $E6EB ;yes,display next E703 81 20 CMPA #$20 ;was it a space ? E705 1026 09D6 LBNE CONTRL ;no,abort E709 BD F53E JSR BYTE ;yes,input byte E70C A7 1F STA -$01,X ;overwrite old byte E70E A1 1F CMPA -$01,X ;read it back E710 27 D9 BEQ $E6EB ;OK,display it E712 8E E6C7 LDX #$E6C7 ;cant read,send E715 BD F4FE JSR PDATA1 ;error message E718 7E F0DF JMP CONTRL ; action DR E71B FCC $D,'Display CPU registers.',4 E733 FCC $A,$D,'CC A B DP X Y U PC S',$A,$D,4 E75C 8E E71B DR LDX #$E71B ; E75F BD F4FE JSR PDATA1 ; E762 8E E733 LDX #$E733 ;print header E765 BD F4FE JSR PDATA1 ; E768 1F41 TFR S,X ; E76A BD F58A JSR OUT2HS ;print registers E76D BD F58A JSR OUT2HS ; E770 BD F58A JSR OUT2HS ; E773 BD F58A JSR OUT2HS ; E776 BD F588 JSR OUT4HS ; E779 BD F588 JSR OUT4HS ; E77C BD F588 JSR OUT4HS ; E77F BD F588 JSR OUT4HS ; E782 8E DF80 LDX #STACK ;get Stack Pointer E785 BD F588 JSR OUT4HS ;print it E788 7E F0DF JMP CONTRL ; action SM E78B FCC $D,'Shift block of memory from ',4 E7A8 FCC 'Length ',4 E7B1 8E E78B SM LDX #$E78B ; E7B4 BD F4FE JSR PDATA1 ; E7B7 BD F533 JSR BADDR ;get 'from' addr. E7BA 3440 PSHS U ; E7BC 1F13 TFR X,U ;store it in U E7BE 8E E3DA LDX #$E3DA ; E7C1 BD F4FE JSR PDATA1 ; E7C4 BD F533 JSR BADDR ;get 'to' addr. E7C7 1F12 TFR X,Y ;store it in Y E7C9 8E E7A8 LDX #$E7A8 ; E7CC BD F4FE JSR PDATA1 ; E7CF BD F533 JSR BADDR ;get length of block E7D2 A6 C0 LDA 0,U+ ;move a byte E7D4 A7 A0 STA 0,Y+ ; E7D6 30 1F LEAX -$01,X ;dec. length E7D8 26 F8 BNE $E7D2 ;repeat 'till end E7DA 3540 PULS U ; E7DC 7E F0DF JMP CONTRL ; action TM (Test Memory) E7DF FCC $D,'Test memory from ',4 E7D2 FCC $7,$A,$D,'Error at location ',4 E808 FCC 'changed to ',4 E814 FCC ' Testing now with ',4 E827 8E E7DF TM LDX #$E7DF ; E82A BD F4FE JSR PDATA1 ; E82D BD F533 JSR BADDR ;get 'from' E830 1F12 TFR X,Y ;put in Y E832 8E E3DA LDX #$E3DA ; E835 BD F4FE JSR PDATA1 ; E838 BD F533 JSR BADDR ;get 'to' E83B BF DF92 STX XTEMP ;store it E83E 5F CLRB ; E83F 8E E814 LDX #$E814 ; E842 BD F4FE JSR PDATA1 ; E845 F7 DF91 STB TEMP ;store 'with' E848 8E DF91 LDX #TEMP ; E84B BD F580 JSR OUT2H ;display 'with' E84E 1F21 TFR Y,X ; E850 E7 A4 STB 0,Y ;write/read test E852 E1 A4 CMPB 0,Y ; E854 26 1A BNE $E870 ;test fails,branch E856 31 21 LEAY $01,Y ;else,next location E858 10BC DF92 CMPY XTEMP ;all done ? E85C 26 F2 BNE $E850 ;no,test it E85E 5C INCB ;yes,next 'with' byte E85F 27 0C BEQ $E86D ;done 'em all.Exit E861 86 08 LDA #$08 ;else,update 'with' E863 BD F16E JSR OUTCH ;byte,return to E866 BD F16E JSR OUTCH ;first location E869 1F12 TFR X,Y ;and continue. E86B 20 D8 BRA $E845 ; E86D 7E F0DF JMP CONTRL ; E870 8E E7F2 LDX #$E7F2 ;error message E873 BD F4FE JSR PDATA1 ; E876 10BF DF92 STY XTEMP ;(faulty location) E87A 8E DF92 LDX #XTEMP ; E87D BD F588 JSR OUT4HS ; E880 BD F58C JSR OUTS ; E883 BD F58C JSR OUTS ; E886 F7 DF91 STB TEMP ;(test byte) E889 8E DF91 LDX #TEMP ; E88C BD F58A JSR OUT2HS ; E88F 8E E808 LDX #$E808 ; E892 BD F4FE JSR PDATA1 ; E895 A6 A4 LDA 0,Y ;(byte read back) E897 B7 DF91 STA TEMP ; E89A 8E DF91 LDX #TEMP ; E89D BD F58A JSR OUT2HS ; E8A0 20 CB BRA $E86D ;exit action RS (Read Sector) E8A2 FCC $D,'Read from sector on drive ',4 E8BE FCC ' track ',4 E8C6 FCC ' sector ',4 E8CF FCC $A,$D,$7,'FDC error code = ',4 E8E4 8E E8A2 RS LDX #$E8A2 ; E8E7 BD F4FE JSR PDATA1 ; E8EA BD F563 JSR INHEX ;get drive No. E8ED B7 DF8E STA DRIVE ; E8F0 8E DF8B LDX #DRIVE-3 ; E8F3 BD F497 JSR DRV ;get drive E8F6 8E E8BE LDX #$E8BE ; E8F9 BD F4FE JSR PDATA1 ; E8FC BD F53E JSR BYTE ;get track E8FF B7 DF8F STA TRACK ; E902 8E E8C6 LDX #$E8C6 ; E905 BD F4FE JSR PDATA1 ; E908 BD F53E JSR BYTE ;get sector E90B B7 DF90 STA SECTOR ; E90E 8E E3DA LDX #$E3DA ; E911 BD F4FE JSR PDATA1 ; E914 BD F533 JSR BADDR ;get load addr. E917 B6 DF8F LDA TRACK ; E91A F6 DF90 LDB SECTOR ; E91D BD F481 JSR READ ;read it in E920 1027 07BB LBEQ CONTRL ;if no read error E924 8E E8CF LDX #$E8CF ; E927 BD F4FE JSR PDATA1 ;else,error message E92A F7 DF91 STB TEMP ;(status,masked) A92D 8E DF91 LDX #TEMP ; A930 BD F58A JSR OUT2HS ;error No. action WS (Write Sector) E936 FCC $D,'Write to sector on drive ',4 E951 FCC ' from ',4 E958 8E E936 WS LDX #$E936 ; E95B BD F4FE JSR PDATA1 ; E95E BD F563 JSR INHEX ;get drive No. E961 B7 DF8E STA DRIVE ; E964 8E DF8B LDX #DRIVE-3 ; E967 BD F497 JSR DRV ;get drive E96A 8E E8BE LDX #$E8BE ; E96D BD F4FE JSR PDATA1 ; E970 BD F53E JSR BYTE ;get track E973 B7 DF8F STA TRACK ; E976 8E E8C6 LDX #$E8C6 ; E979 BD F4FE JSR PDATA1 ; E97C BD F53E JSR BYTE ;get sector E97F B7 DF90 STA SECTOR ; E982 8E E951 LDX #$E951 ; E985 BD F4FE JSR PDATA1 ; E988 BD F533 JSR BADDR ;get data addr. E98B B6 DF8F LDA TRACK ; E98E F6 DF90 LDB SECTOR ; E991 BD F485 JSR WRITE ;write sector E994 1027 0747 LBEQ CONTRL ;if no write error E998 8E E8CF LDX #$E8CF ; E99B BD F4FE JSR PDATA1 ;else,error message E99E F7 DF91 STB TEMP ; E9A1 8E DF91 LDX #TEMP ; E9A4 BD F58A JSR OUT2HS ; E9A7 7E F0DF JMP CONTRL ; action DF (Disc Format) E9AA FCC $D,'Format disc to flex standard on drive ',4 E9D2 FCC ' scratch disc in drive? ',4 E9EB 8E E9AA DF LDX #$E9AA ; E9EE BD F4FE JSR PDATA1 ; E9F1 BD F563 JSR INHEX ;get drive No. E9F4 B7 DF8E STA DRIVE ; E9F7 8E DF8B LDX #DRIVE-3 ; E9FA BD F48D JSR RST ;restore to 00 E9FD 7F DFF4 CLR DEN ;set single density EA00 8E E9D2 LDX #$E9D2 ;prompt for scratch EA03 BD F4FE JSR PDATA1 ;disc in drive. EA06 BD F16C JSR INCH ;get reply EA09 81 59 CMPA #$59 ;if not 'Y' EA0B 1026 06D0 LBNE CONTRL ;then abort. EA0F 86 FF LDA #$FF ;else,initialise. EA11 B7 DF8F STA TRACK ;(01-1) EA14 108E 0002 LDY #$0002 ;(track/sector) EA18 4F CLRA ; EA19 B7 DF90 STA SECTOR ;(01-1) EA1C 7C DF8F INC TRACK ; EA1F B6 DF8F LDA TRACK ; EA22 C6 01 LDB #$01 ; EA24 BD F4EB JSR SEEK ; this is written to all tracks EA27 4F CLRA ; EA28 8E 0190 LDX #$0190 ;starting this addr. EA2B C6 06 LDB #$06 ; EA2D 17 00FD LBSR $EB2D ;6 bytes---00 EA30 86 FC LDA #$FC ; EA32 A7 80 STA 0,X+ ;1 bytes---FC EA34 86 FF LDA #$FF ; EA36 C6 07 LDB #$07 ; EA38 17 00F2 LBSR $EB2D ;7 bytes---FF this written to all sectors EA3B 4F CLRA ; EA3C 7C DF90 INC SECTOR ; EA3F C6 06 LDB #$06 ; EA41 17 00E9 LBSR $EB2D ;6 bytes---00 EA44 86 FE LDA #$FE ; EA46 A7 80 STA 0,X+ ;1 bytes---FE EA48 B6 DF8F LDA TRACK ; EA4B A7 80 STA 0,X+ ;1 bytes---[TRACK] EA4D 4F CLRA ; EA4E A7 80 STA 0,X+ ;1 bytes---00 EA50 B6 DF90 LDA SECTOR ; EA53 A7 80 STA 0,X+ ;1 bytes---[SECTOR] EA55 86 01 LDA #$01 ; EA57 A7 80 STA 0,X+ ;1 bytes---01 EA59 86 F7 LDA #$F7 ; EA5B A7 80 STA 0,X+ ;1 bytes---F7 EA5D 86 FF LDA #$FF ; EA5F C6 0B LDB #$0B ; EA61 17 00C9 LBSR $EB2D ;11 bytes---FF EA64 4F CLRA ; EA65 C6 06 LDB #$06 ; EA67 17 00C3 LBSR $EB2D ;6 bytes---00 EA6A 86 FB LDA #$FB ; EA6C A7 80 STA 0,X+ ;1 bytes---FB enter track/sector link,clear data bytes, update track/sector link. EA6E 1F20 TFR Y,D ;get T/S link addr. EA70 ED 81 STD 0,X++ ;enter it. EA72 5C INCB ; EA73 C1 0B CMPB #$0B ;all sectors done ? EA75 26 0A BNE $EA81 ;no,continue EA77 4C INCA ;yes,update T/S EA78 C6 01 LDB #$01 ;link address. EA7A 81 28 CMPA #$28 ;all tracks done ? EA7C 26 03 BNE $EA81 ;no,continue EA7E CC 0000 LDD #$0000 ;yes,clear T/S link EA81 1F02 TFR D,Y ;save updated link EA83 4F CLRA ;clear data bytes EA84 C6 FE LDB #$FE ; EA86 17 00A4 LBSR $EB2D ;254 bytes---00 EA89 86 F7 LDA #$F7 ; EA8B A7 80 STA 0,X+ ;1 bytes---F7 EA8D 86 FF LDA #$FF ; EA8F C6 0E LDB #$0E ; EA91 17 0099 LBSR $EB2D ;14 bytes---FF EA94 B6 DF90 LDA SECTOR ; EA97 81 0A CMPA #$0A ;last sector ? EA99 26 A0 BNE $EA3B ;no,do next EA9B 86 FF LDA #$FF ;yes, EA9D 5F CLRB ; EA9E 17 008C LBSR $EB2D ;256 bytes---FF write a track to disc EAA1 8E 0190 LDX #$0190 ; EAA4 86 F4 LDA #$F4 ;write track cmd. EAA6 17 0771 LBSR $F21A ; EAA9 B6 FF10 LDA COMREG ;get status EAAC 85 02 BITA #$02 ;D-reg empty ? EAAE 27 05 BEQ $EAB5 ; EAB0 A6 80 LDA 0,X+ ;yes,load it EAB2 B7 FF13 STA DATREG ; EAB5 B6 FF10 LDA COMREG ; EAB8 85 01 BITA #$01 ;busy ? EABA 26 ED BNE $EAA9 ;yes,wait EABC B6 DF8F LDA TRACK ; EABF 81 27 CMPA #$27 ;last track ? EAC1 1026 FF53 LBNE $EA18 ;no,do next remove link addr.from final directory sector EAC5 8E DF8B LDX #DRIVE-3 ;yes, EAC8 BD F48D JSR RST ; EACB 8E DE80 LDX #BUFFER ;read T/S 00/0A EACE 4F CLRA ;into buffer, EACF C6 0A LDB #$0A ;zero the link addr. EAD1 BD F481 JSR READ ;(no more directory EAD4 8E DE80 LDX #BUFFER ;sectors) EAD7 6F 84 CLR 0,X ; EAD9 6F 01 CLR $01,X ; EADB 4F CLRA ; EADC C6 0A LDB #$0A ;and write it EADE BD F485 JSR WRITE ;back to disc. enter data to Sys.Information sector EAE1 8E DE80 LDX #BUFFER ; EAE4 4F CLRA ; EAE5 C6 03 LDB #$03 ; EAE7 BD F481 JSR READ ;read T/S 00/03 EAEA 8E DE80 LDX #BUFFER ;into buffer, EAED 6F 84 CLR 0,X ;clear link addr. EAEF 6F 01 CLR $01,X ; EAF1 CC 5343 LDD #$5343 ;enter name of disc. EAF4 ED 8810 STD $10,X ; EAF7 CC 5241 LDD #$5241 ;(SCRATCH!) EAFA ED 8812 STD $12,X ; EAFD CC 5443 LDD #$5443 ; EB00 ED 8814 STD $14,X ; EB03 CC 4821 LDD #$4821 ; EB06 ED 8816 STD $16,X ; EB09 CC 0001 LDD #$0001 ;enter Vol. No. EB0C ED 881B STD $1B,X ; EB0F CC 0101 LDD #$0101 ;enter start of EB12 ED 881D STD $1D,X ;free chain. EB15 CC 270A LDD #$270A ;enter end of EB18 ED 881F STD $1F,X ;free chain and EB1B ED 8826 STD $26,X ;highest sector adr. EB1E CC 0186 LDD #$0186 ;enter length of EB21 ED 8821 STD $21,X ;free chain. (ie. EB24 4F CLRA ;sectors left). EB25 C6 03 LDB #$03 ; EB27 BD F485 JSR WRITE ;write it back. EB2A 7E F0DF JMP CONTRL ; this subroutine stores ACCA in [B] locations starting at location [X]. EB2D 3404 PSHS B ; EB2F A7 80 STA 0,X+ ; EB31 5A DECB ; EB32 26 FB BNE $EB2F ; EB34 3584 PULS B,PC ; action TD (Test Drive) EB36 FCC $D,'Random sector read on drive ',4 EB54 FCC 'Hit any key to stop.',4 EB69 FCC 'at track/sector ',4 EB7A 8E EB36 TD LDX #$EB36 ; EB7D BD F4FE JSR PDATA1 ; EB80 BD F563 JSR INHEX ;get drive No. EB83 B7 DF8E STA DRIVE ; EB86 8E EB54 LDX #$EB54 ; EB89 BD F505 JSR PSTRNG ; EB8C 8E DF8B LDX #DRIVE-3 ; EB8F BD F48D JSR RST ; EB92 BD F591 JSR RANDOM ;get a random No. EB95 84 0F ANDA #$0F ;15 max EB97 8B 01 ADDA #$01 ;>0 EB99 81 0A CMPA #$0A ;>10 ? EB9B 2E F5 BGT $EB92 ;yes,get another EB9D B7 DF90 STA SECTOR ;else,store it. EBA0 BD F591 JSR RANDOM ;get a random No. EBA3 84 3F ANDA #$3F ;63 max EBA5 81 27 CMPA #$27 ;>39 ? EBA7 2E F7 BGT $EBA0 ;yes,get another EBA9 B7 DF8F STA TRACK ;else,set random EBAC F6 DF90 LDB SECTOR ;track and sector. EBAF 8E DE80 LDX #BUFFER ; EBB2 BD F481 JSR READ ;read into buffer. EBB5 26 0E BNE $EBC5 ;read error if <> 0. EBB7 BD F131 JSR STATUS ;key pressed ? EBBA 27 D6 BEQ $EB92 ;no,continue EBBC 8E DF8B LDX #DRIVE-3 ;yes, EBBF BD F48D JSR RST ;restore to 00 EBC2 7E F0DF JMP CONTRL ;and abort. EBC5 8E E8CF LDX #$E8CF ;report ---- EBC8 BD F4FE JSR PDATA1 ; EBCB F7 DF91 STB TEMP ; EBCE 8E DF91 LDX #TEMP ; EBD1 BD F58A JSR OUT2HS ;error No.'x', at EBD4 8E EB69 LDX #$EB69 ; EBD7 BD F4FE JSR PDATA1 ; EBDA 8E DF8F LDX #TRACK ; EBDD BD F588 JSR OUT4HS ;'track/sector' EBE0 7E EB92 JMP $EB92 ;continue. action TS (Test Stepping) EBE3 FCC $D,'Test stepping on drive ',4 EBFC 8E EBE3 TS LDX #$EBE3 ; EBFF BD F4FE JSR PDATA1 ; EC02 BD F563 JSR INHEX ;get drive No. EC05 B7 DF8E STA DRIVE ; EC08 8E DF8B LDX #DRIVE-3 ; EC0B BD F497 JSR DRV ;select drive EC0E 86 28 LDA #$28 ; EC10 C6 01 LDB #$01 ; EC12 BD F4EB JSR SEEK ;track 40,sector 1 EC15 BD F48D JSR RST ;restore to 00 EC18 BD F131 JSR STATUS ;key pressed ? EC1B 1026 04C0 LBNE CONTRL ;yes,abort EC1F 20 ED BRA $EC0E ;no,do it again action BF (Boot Flex from floppy 0 regardless of allocation) EC21 7F DF9D CLR DDSTAB ;set Drv.0=floppy 0 EC24 16 F668 LBRA $E28F ;jump to BO this appears to be redundant ??? EC27 7E F0DF JMP CONTRL ; action DC (Display Clock) EC2A FCC $D,'Display RTC contents.',4 EC41 8E EC2A DC LDX #$EC2A ;print header EC44 BD F4FE JSR PDATA1 ; EC47 BD F4F2 JSR PCRLF ; EC4A 5F CLRB ;point to 1st byte EC4B 8E 000E LDX #$000E ;print 14 bytes EC4E 8D 2B BSR $EC7B ;time,date & registers EC50 8E 0001 LDX #$0001 ;print 1 byte EC53 8D 26 BSR $EC7B ;configuration SW. EC55 8E 0001 LDX #$0001 ;print 1 byte EC58 8D 21 BSR $EC7B ;baudrates EC5A 8E 0004 LDX #$0004 ;print 4 bytes EC5D 8D 1C BSR $EC7B ;disc allocations EC5F 8E 000B LDX #$000B ;print 11 bytes EC62 8D 17 BSR $EC7B ;ttyset EC64 8E 0002 LDX #$0002 ;print 2 bytes EC67 8D 12 BSR $EC7B ;asn EC69 8E 0008 LDX #$0008 ;print 8 bytes EC6C 8D 0D BSR $EC7B ;GDC defaults EC6E 8E 0007 LDX #$0007 ;print 7 bytes EC71 8D 08 BSR $EC7B ;reserved EC73 8E 0010 LDX #$0010 ;print 16 bytes EC76 8D 03 BSR $EC7B ;not used.(available) EC78 7E F0DF JMP CONTRL ; this subroutine prints a line of bytes EC7B BD F5C1 JSR GETRTC ;get byte EC7E 5C INCB ;point to next EC7F B7 DF91 STA TEMP ; EC82 3410 PSHS X ; EC84 8E DF91 LDX #TEMP ;output bytes EC87 BD F58A JSR OUT2HS ; EC8A 3510 PULS X ; EC8C 30 1F LEAX -$01,X ; EC8E 26 EB BNE $EC7B ;until line finished EC90 BD F4F2 JSR PCRLF ; EC93 39 RTS ; action MC (Modify Clock) EC94 FCC $D,'RTC examine and alter from ',4 ECB1 8E EC94 MC LDX #$EC94 ;print header ECB4 BD F4FE JSR PDATA1 ; ECB7 BD F53E JSR BYTE ;input offset ECBA 1F89 TFR A,B ; ECBC C4 3F ANDB #$3F ; ECBE BD F4F2 JSR PCRLF ; ECC1 F7 DF91 STB TEMP ; ECC4 8E DF91 LDX #TEMP ; ECC7 BD F58A JSR OUT2HS ;print offset ECCA BD F5C1 JSR GETRTC ;get that byte ECCD B7 DF91 STA TEMP ; ECD0 8E DF91 LDX #TEMP ; ECD3 BD F580 JSR OUT2H ;and print it ECD6 BD F16C JSR INCH ;input a char ECD9 81 20 CMPA #$20 ;was it a space ? ECDB 26 09 BNE $ECE6 ;no,try ECDD BD F53E JSR BYTE ;yes,input a byte ECE0 BD F5DF JSR PUTRTC ;put in RTC ECE3 5C INCB ;point to next ECE4 20 D6 BRA $ECBC ;and jump to it ECE6 81 0D CMPA #$0D ;was it ? ECE8 26 03 BNE $ECED ;no,try '-' ECEA 5C INCB ;yes,point to next ECEB 20 CF BRA $ECBC ;and jump to it ECED 81 2D CMPA #$2D ;was it a '-' ? ECEF 1026 03EC LBNE CONTRL ;no,exit ECF3 5A DECB ;yes,backpeddle 1 ECF4 20 C6 BRA $ECBC ; action FI (FInd byte string) [There is a BUG in this routine] ECF6 FCC $D,'Find byte string from ',4 ED0E FCC $D,$A,'enter byte string ',4 This bit stores the start & end addresses of the block to be searched and loads the string templet into the buffer. ED24 8E ECF6 FI LDX #$ECF6 ; ED27 BD F4FE JSR PDATA1 ; ED2A BD F533 JSR BADDR ;input 'from' ED2D BF DF94 STX YTEMP ;store it ED30 8E E3DA LDX #$E3DA ; ED33 BD F4FE JSR PDATA1 ; ED36 BD F533 JSR BADDR ;input 'to' ED39 BF DF96 STX TTO ;store it ED3C 8E ED0E LDX #$ED0E ; ED3F BD F4FE JSR PDATA1 ; ED42 8E DE80 LDX #BUFFER ; ED45 5F CLRB ;clr. count ED46 BD F53E JSR BYTE ;input a byte ED49 A7 80 STA 0,X+ ;put in buffer ED4B 5C INCB ;inc. count ED4C BD F16C JSR INCH ;input a char ED4F 81 20 CMPA #$20 ;was it a space ? ED51 27 F3 BEQ $ED46 ;yes,get next byte This bit searches for a match with the templet ED53 F7 DF91 STB TEMP ;length of templet ED56 BE DF94 LDX YTEMP ;point to start adr. ED59 108E DE80 LDY #BUFFER ;& start of templet ED5D A6 80 LDA 0,X+ ;compare charater ED5F A1 A0 CMPA 0,Y+ ; ED61 26 08 BNE $ED6B ;no match,branch ED63 5A DECB ;end of string ? ED64 26 F7 BNE $ED5D ;no,try next char. ED66 BD F4F2 JSR PCRLF ;yes,do CRLF ED69 8D 11 BSR $ED7C ;print out result. ED6B F6 DF91 LDB TEMP ;reset count ED6E 108E DE80 LDY #BUFFER ;point to 1st char. ED72 BC DF96 CMPX TTO ;end of search block ? ED75 27 02 BEQ $ED79 ;yes,exit. BUG here. Should LEAX -1,X first. ED77 20 E4 BRA $ED5D ;no,continue search ED79 7E F0DF JMP CONTRL ; This bit prints out the results,(if any). ED7C 3436 PSHS A,B,X,Y ; ED7E B6 DF91 LDA TEMP ;get length of string ED81 40 NEGA ; ED82 30 86 LEAX A,X ;sub.from current adr. ED84 1F12 TFR X,Y ;copy to Y ED86 31 3A LEAY -$06,Y ;Y points to string-6 ED88 BF DF92 STX XTEMP ; ED8B 8E DF92 LDX #XTEMP ;get addr.of string ED8E BD F588 JSR OUT4HS ;print it ED91 1F21 TFR Y,X ;point to string-6 ED93 C6 10 LDB #$10 ;print out 16 bytes ED95 A6 A0 LDA 0,Y+ ; ED97 B7 DF92 STA XTEMP ; ED9A 8E DF92 LDX #XTEMP ; ED9D BD F58A JSR OUT2HS ; EDA0 5A DECB ; EDA1 26 F2 BNE $ED95 ; EDA3 BD F58C JSR OUTS ;followed by EDA6 BD F58C JSR OUTS ;2 spaces. EDA9 31 30 LEAY -$10,Y ;back to string-6 EDAB C6 10 LDB #$10 ;now print ascii EDAD A6 A0 LDA 0,Y+ ; EDAF 81 20 CMPA #$20 ;is it printable ? EDB1 2C 02 BGE $EDB5 ;yes,print it EDB3 86 2E LDA #$2E ;no,substitute dot EDB5 BD F16E JSR OUTCH ; EDB8 5A DECB ; EDB9 26 F2 BNE $EDAD ; EDBB 35B6 PULS A,B,X,Y,PC ; action SB (Set Baud rate) EDBD FCC $D,'Set baud rate for acia ',4 EDD6 FCC ' baud rate = ',4 EDE4 FCC ' Baud rate not known.',4 EDFA 8E EDBD SB LDX #$EDBD ; EDFD BD F4FE JSR PDATA1 ; EE00 BD F563 JSR INHEX ;get acia No. EE03 84 01 ANDA #$01 ;NB.if acia2,A=0 EE05 B7 DF91 STA TEMP ;store it EE08 8E EDD6 LDX #$EDD6 ;ask for baud rate. EE0B BD F4FE JSR PDATA1 ; EE0E BD F16C JSR INCH ;input first 2 digits, EE11 1F89 TFR A,B ;(ascii/decimal),of EE13 BD F16C JSR INCH ;reqd.baud rate. EE16 1E89 EXG A,B ;put them in order EE18 1E02 EXG D,Y ;and store in Y EE1A 8E EE7C LDX #$EE7C ;use look-up table EE1D 10AC84 CMPY 0,X ;found it ? EE20 27 10 BEQ $EE32 ;yes,branch EE22 30 06 LEAX $06,X ;no,try next EE24 8C EED6 CMPX #$EED6 ;all tried ? EE27 26 F4 BNE $EE1D ;no,continue EE29 8E EDE4 LDX #$EDE4 ;yes,error exit. EE2C BD F4FE JSR PDATA1 ; EE2F 7E F0DF JMP CONTRL ; print out last 3 digits of baud rate EE32 A6 02 LDA $02,X ; EE34 BD F16E JSR OUTCH ; EE37 A6 03 LDA $03,X ; EE39 BD F16E JSR OUTCH ; EE3C A6 04 LDA $04,X ; EE3E BD F16E JSR OUTCH ; pick-up RTC code and set baud rate EE41 A6 05 LDA $05,X ;get RTC code EE43 8E FF0C LDX #BAUD1 ;select register for EE46 F6 DF91 LDB TEMP ;nominated acia. EE49 F7 DF92 STB XTEMP ; EE4C 3A ABX ; EE4D A7 84 STA 0,X ;load code. EE4F B7 DF91 STA TEMP ;save code. EE52 C6 0F LDB #$0F ;get existing RTC EE54 BD F5C1 JSR GETRTC ; EE57 7D DF92 TST XTEMP ;which acia ? EE5A 26 07 BNE $EE63 ;acia1,branch EE5C 84 F0 ANDA #$F0 ;erase acia2 code EE5E BB DF91 ADDA TEMP ;subs. new code EE61 20 11 BRA $EE74 ;go put in clock. EE63 F6 DF91 LDB TEMP ;was acia1. get code. EE66 58 ASLB ;shift into EE67 58 ASLB ;high nibble. EE68 58 ASLB ; EE69 58 ASLB ; EE6A C4 F0 ANDB #$F0 ; EE6C 84 0F ANDA #$0F ;erase acia1 code. EE6E F7 DF91 STB TEMP ; EE71 BB DF91 ADDA TEMP ;subs. new code. EE74 C6 0F LDB #$0F ;store in RTC. EE76 BD F5DF JSR PUTRTC ; EE79 7E F0DF JMP CONTRL ; look-up table EE7C FCB '5,'0,' ,' ,' ,0 EE82 FCB '7,'5,' ,' ,' ,1 EE88 FCB '1,'1,'0,' ,' ,2 EE8E FCB '1,'3,'5,' ,' ,3 EE94 FCB '1,'5,'0,' ,' ,4 EE9A FCB '3,'0,'0,' ,' ,6 EEA0 FCB '6,'0,'0,' ,' ,7 EEA6 FCB '1,'2,'0,'0,' ,8 EEAC FCB '1,'8,'0,'0,' ,9 EEB2 FCB '2,'4,'0,'0,' ,A EEB8 FCB '3,'6,'0,'0,' ,B EEBE FCB '4,'8,'0,'0,' ,C EEC4 FCB '7,'2,'0,'0,' ,D EECA FCB '9,'6,'0,'0,' ,E EED0 FCB '1,'9,'2,'0,'0,F action RESET (cold start entry) F08E B7 FFDD RESET STA $FFDD ;set 64K,dynamic F091 B7 FFDF STA $FFDF ;set Map type 1 F094 B6 DF9C LDA WARMS ;warm start ? F097 81 AA CMPA #$AA ; F099 27 18 BEQ $F0B3 ; F09B 4F CLRA ; F09C 8E DF80 LDX #STACK ;clear scratch ram F09F A7 80 STA 0,X+ ; F0A1 8C E000 CMPX #$E000 ; F0A4 26 F9 BNE $F09F ; F0A6 86 AA LDA #$AA ;set warm start F0A8 B7 DF9C STA WARMS ; F0AB 10CE DE6F LDS #$DE6F ;stack base (MONO9) F0AF 10FF DF80 STS STACK ; F0B3 108E F111 LDY #$F111 ;point all interrupt F0B7 8E DF82 LDX #$DF82 ;vectors to error F0BA 10AF81 STY 0,X++ ;message & exit. F0BD 8C DF8C CMPX #$DF8C ; F0C0 26 F8 BNE $F0BA ; F0C2 86 0F LDA #$0F ;set DDRA F0C4 B7 FF02 STA SYSREG ;Hi-nib=in, F0C7 86 3C LDA #$3C ;Lo-nib=out F0C9 B7 FF03 STA PIACB ; F0CC 86 34 LDA #$34 ;setup keyboard port F0CE B7 FF01 STA PIACA ; F0D1 86 06 LDA #$06 ;set Drv 0,SD,and F0D3 B7 FF02 STA SYSREG ;Rom at $E000. F0D6 7E E06F JMP $E06F ;do rest of setup. ;(jumps back to here) F0D9 8E E000 LDX #$E000 ;(adr of header) F0DC BD F4FE JSR PDATA1 ; action CONTRL (warm start entry) F0DF B6 FF02 CONTRL LDA SYSREG ;set"MAP"=1.(ie.ROM) F0E2 8A 04 ORA #$04 ; F0E4 B7 FF02 STA SYSREG ; F0E7 8E E02E LDX #$E02E ;print and F0EA BD F4FE JSR PDATA1 ;monitor prompt F0ED 8D 7D BSR INCH ;get 2 char cmd F0EF 1F89 TFR A,B ; F0F1 8D 79 BSR INCH ; F0F3 1E89 EXG A,B ; F0F5 1F02 TFR D,Y ; F0F7 8E E163 LDX #$E163 ;parse it and F0FA 10AC81 CMPY 0,X++ ; F0FD 26 02 BNE $F101 ; F0FF 6E 94 JMP [0,X] ;jump to it F101 30 02 LEAX $02,X ; F103 A6 84 LDA 0,X ; F105 81 FF CMPA #$FF ;invalid cmd. ? F107 26 F1 BNE $F0FA ;no,continue F109 8E E033 LDX #$E033 ;else,print error F10C BD F4FE JSR PDATA1 ;message and F10F 20 CE BRA $F0DF ;and try again. unexpected interupt action F111 8E E047 LDX #$E047 ;send message F114 BD F505 JSR PSTRNG ; F117 1A 50 ORCC #$50 ;mask interupts F119 7E F08E JMP RESET ; F11C 6E 9FDF82 JMP [NMIV ] ; F120 6E 9FDF84 JMP [IRQV ] ; F124 6E 9FDF86 JMP [FIRQV] ; F128 6E 9FDF88 JMP [SWI2V] ; F12C 6E 9FDF8A JMP [SWI3V] ; F130 39 RTS ; check for character F131 3416 STATUS PSHS A,B,X ; F133 7D DF8D TST OPORT ;video monitor ? F136 26 10 BNE $F148 ;no,skip flash routine F138 BE DFF8 LDX FLASH ;used here as counter F13B 26 06 BNE $F143 ;if <> 0,go decrement F13D BD FB47 JSR $FB47 ;else toggle cursor F140 8E 07D0 LDX #$07D0 ;& reset counter F143 30 1F LEAX -$01,X ; F145 BF DFF8 STX FLASH ; F148 8E F187 LDX #$F187 ; F14B F6 DF8C LDB IPORT ; F14E 58 ASLB ; F14F AD 95 JSR [B,X] ;check for interrupt F151 3596 PULS A,B,X,PC ;Z=1 if no interruptp input char without echo F153 3414 INCH1 PSHS B,X ; F155 8D DA BSR STATUS ;wait for interrupt F157 27 FC BEQ $F155 ; F159 7D DFFA TST $DFFA ;cursor blanked ? F15C 27 03 BEQ $F161 ;no,skip F15E BD FB47 JSR $FB47 ;yes,toggle again F161 8E F17B LDX #$F17B ; F164 F6 DF8C LDB IPORT ; F167 58 ASLB ; F168 AD 95 JSR [B,X] ;get char.into ACCA F16A 3594 PULS B,X,PC ; input character F16C 8D E5 INCH BSR $F153 ; output character F16E 3414 OUTCH PSHS B,X ; F170 8E F181 LDX #$F181 ; F173 F6 DF8D LDB OPORT ; F176 58 ASLB ; F177 AD 95 JSR [B,X] ; F179 3594 PULS B,X,PC ; F17B FDB F18D ;INKEY F17D FDB F193 ;GETA1 F17F FDB F199 ;GETA2 F181 FDB F19F ;PUTVID F183 FDB F1A2 ;PUTA1 F185 FDB F1AD ;PUTA2 F187 FDB F1B8 ;QINT0 F189 FDB F1BE ;QINT1 F18B FDB F1C4 ;QINT2 get char from keyboard F18D B6 FF00 INKEY LDA KEYREG ; F190 84 7F ANDA #$7F ; F192 39 RTS ; Get char from acia port 1 F193 B6 FF08 GETA1 LDA ACIAD1 ; F196 84 7F ANDA #$7F ; F198 39 RTS ; Get char from acia port 2 F199 B6 FF04 GETA2 LDA ACIAD2 ; F19C 84 7F ANDA #$7F ; F19E 39 RTS ; send char to video F19F 7E FB17 PUTVID JMP GDCOUT ; send char to acia1 F1A2 F6 FF09 PUTA1 LDB ACIAC1 ;check status F1A5 C5 01 BITB #$01 ;TX ready ? F1A7 27 F9 BEQ $F1A2 ;no,wait F1A9 B7 FF08 STA ACIAD1 ;yes,send char. F1AC 39 RTS ; eend char to acia2 F1AD F6 FF05 PUTA2 LDB ACIAC2 ; F1B0 C5 01 BITB #$01 ; F1B2 27 F9 BEQ $F1AD ; F1B4 B7 FF04 STA ACIAD2 ; F1B7 39 RTS ; check for interrupt,port 0 (keyboard). F1B8 B6 FF01 QINT0 LDA PIACA ; F1BB 85 80 BITA #$80 ;test flag F1BD 39 RTS ;if not,Z=1 check interrupt port 1 F1BE B6 FF09 QINT1 LDA ACIAC1 ; F1C1 84 02 ANDA #$02 ; F1C3 39 RTS ; check interrupt port 2 F1C4 B6 FF05 QINT2 LDA ACIAC2 ; F1C7 84 02 ANDA #$02 ; F1C9 39 RTS ; disc drive vector table F1CA FDB F231 reavec,0 } F1CB FDB F272 wrivec,0 } F1CE FDB F2A3 vervec,0 } F1D0 FDB F2AE rstvec,0 } F1D2 FDB F2EE drvvec,0 } floppy drive 0 F1D4 FDB F324 chkvec,0 } F1D6 FDB F324 quivec,0 } F1D8 FDB F324 inivec,0 } F1DA FDB F324 warvec,0 } F1DC FDB F2C4 seevec,0 } F1DE FDB F231 reavec,1 } F1E0 FDB F272 wrivec,1 } F1E2 FDB F2A3 vervec,1 } F1E4 FDB F2AE rstvec,1 } F1E6 FDB F2F5 drvvec,1 } floppy drive 1 F1E8 FDB F324 chkvec,1 } F1EA FDB F324 quivec,1 } F1EC FDB F324 inivec,1 } F1EE FDB F324 warvec,1 } F1F0 FDB F2C4 seevec,1 } F1F2 FDB F350 reavec,2 } F1F4 FDB F329 wrivec,2 } F1F6 FDB F324 vervec,2 } F1F8 FDB F329 rstvec,2 } F1FA FDB F3A5 drvvec,2 } ROMDISC F1FC FDB F3A5 chkvec,2 } F1FE FDB F3A5 quivec,2 } F200 FDB F324 inivec,2 } F202 FDB F324 warvec,2 } F204 FDB F324 seevec,2 } F206 FDB F3BF reavec,3 } F208 FDB F415 wrivec,3 } F20A FDB F465 vervec,3 } F20C FDB F466 rstvec,3 } F20E FDB F466 drvvec,3 } RAMDISC F210 FDB F466 chkvec,3 } F212 FDB F466 quivec,3 } F214 FDB F324 inivec,3 } F216 FDB F324 warvec,3 } F218 FDB F324 seevec,3 } load FDC command F21A 8D 06 BSR QBUSY ;wait 'till ready F21C B7 FF10 STA COMREG ;load command F21F 7E F22A JMP PAUSE ; query FDC busy status F222 F6 FF10 QBUSY LDB COMREG ;get status register F225 C5 01 BITB #$01 ;inspect bit 0 F227 26 F9 BNE QBUSY ;if busy,wait F229 39 RTS ; twiddle your thumbs for 50 micro-Secs. F22A 17 0000 PAUSE LBSR $F22D ; F22D 17 0000 LBSR $F230 ; F230 39 RTS ; read a sector from floppy drive 0/1 F231 17 0090 LBSR $F2C4 ;seek track/sector F234 86 FF LDA #$FF ;set DP = $FF F236 1E8B EXG A,DP ; F238 3402 PSHS A ;save old DP F23A 86 84 LDA #$84 ;read sector cmd. F23C 8D DC BSR $F21A ;load command F23E 5F CLRB ; F23F 96 10 LDA $10 ;COMREG (status) F241 85 02 BITA #$02 ;data reg full ? F243 26 0C BNE $F251 ;yes,branch F245 85 01 BITA #$01 ;cmd executed ? F247 26 F6 BNE $F23F ;no,wait F249 20 0F BRA $F25A ; F24B 96 10 LDA $10 ;status F24D 85 06 BITA #$06 ;ready ? F24F 27 FA BEQ $F24B ;no,wait F251 96 13 LDA $13 ;data reg. F253 A7 80 STA 0,X+ ; F255 5A DECB ;last byte done ? F256 26 F3 BNE $F24B ;no,continue F258 20 E5 BRA $F23F ;yes,check status F25A 1F89 TFR A,B ;ACCB = status F25C 3502 PULS A ;restore DP F25E 1E8B EXG A,DP ; F260 C5 10 BITB #$10 ;record found ? F262 27 0B BEQ $F26F ;yes,exit F264 B6 FF02 LDA SYSREG ;no,toggle DDEN F267 88 02 EORA #$02 ; F269 B7 FF02 STA SYSREG ; F26C 73 DFF4 COM DEN ;toggle DEN F26F C4 1C ANDB #$1C ; F271 39 RTS ;Z=1 if no error. write a sector to floppy drive 0/1 F272 8D 50 BSR $F2C4 ;seek track/sector F274 86 FF LDA #$FF ;change DP F276 1E8B EXG A,DP ; F278 3402 PSHS A ;save old DP F27A 86 A4 LDA #$A4 ;write sector cmd. F27C 8D 9C BSR $F21A ;load cmd. F27E 5F CLRB ; F27F 96 10 LDA $10 ;get status F281 85 02 BITA #$02 ;data reg.empty ? F283 26 0C BNE $F291 ;yes,branch F285 85 01 BITA #$01 ;busy ? F287 26 F6 BNE $F27F ;yes,wait F289 20 0F BRA $F29A ;else,branch F28B 96 10 LDA $10 ;check status F28D 85 06 BITA #$06 ;ready ? F28F 27 FA BEQ $F28B ;no,wait F291 A6 80 LDA 0,X+ ;send byte F293 97 13 STA DATREG ; F295 5A DECB ;all done ? F296 26 F3 BNE $F28B ;no,continue F298 20 E5 BRA $F27F ;yes,check status F29A 1F89 TFR A,B ;put status in B F29C 3502 PULS A ;restore DP F29E 1E8B EXG A,DP ; F2A0 C4 5C ANDB #$5C ;test status F2A2 39 RTS ;Z=1 if no error. verify a sector on floppy drive 0/1 F2A3 86 84 LDA #$84 ;(read sector cmd) F2A5 17 FF72 LBSR $F21A ;load cmd. F2A8 17 FF77 LBSR QBUSY ;wait 'till finished F2AB C4 18 ANDB #$18 ; F2AD 39 RTS ;Z=1 if no error restore to track 00 floppy drive 0/1 F2AE B6 FF02 LDA SYSREG ; F2B1 8A 02 ORA #$02 ;set single density F2B3 B7 FF02 STA SYSREG ; F2B6 86 00 LDA #$00 ;restore cmd. F2B8 BB DFF6 ADDA STEP ;adjust for step rate F2BB 17 FF5C LBSR $F21A ;load cmd. F2BE 17 FF61 LBSR QBUSY ;wait 'till finished F2C1 C4 58 ANDB #$58 ; F2C3 39 RTS ;z=1 if no error seek to track/sector floppy drive 0/1 F2C4 F7 FF12 STB SECREG ;rqud. sector F2C7 B7 FF13 STA DATREG ;reqd. track F2CA 4D TSTA ; F2CB 27 E1 BEQ $F2AE ;rst to 00,floppy. F2CD B6 FF02 LDA SYSREG ; F2D0 7D DFF4 TST DEN ;double density ? F2D3 27 04 BEQ $F2D9 ;no,set single F2D5 84 FD ANDA #$FD ;yes,set double F2D7 20 02 BRA $F2DB ; F2D9 8A 02 ORA #$02 ; F2DB B7 FF02 STA SYSREG ; F2DE 86 10 LDA #$10 ;seek sector cmd. F2E0 BB DFF6 ADDA STEP ;adjusted for step ratw F2E3 17 FF34 LBSR $F21A ;load cmd. F2E6 17 FF39 LBSR QBUSY ;wait 'till finished F2E9 C5 10 BITB #$10 ;check status F2EB 16 FF3C LBRA PAUSE ;exit via pause. ;Z=1 if no error. select floppy drive 0 F2EE B6 FF02 LDA SYSREG ;set DRV 0 F2F1 84 FE ANDA #$FE ; F2F3 20 05 BRA $F2FA ; select floppy drive 1 F2F5 B6 FF02 LDA SYSREG ; F2F8 8A 01 ORA #$01 ; F2FA B7 FF02 STA SYSREG ; F2FD E6 03 LDB $03,X ;get drive No. F2FF F1 DFB6 CMPB CURDRV ;same as current ? F302 1027 001E LBEQ NVC0_Z1 ;yes,branch F306 F7 DFB6 STB CURDRV ;else,update crrent. F309 B6 FF11 LDA TRKREG ;set TRACK & DEN F30C F6 DF8F LDB TRACK ; F30F B7 DF8F STA TRACK ; F312 F7 FF11 STB TRKREG ; F315 B6 DFF4 LDA DEN ; F318 F6 DFF5 LDB DEN1 ; F31B B7 DFF5 STA DEN1 ; F31E F7 DFF4 STB DEN ; F321 16 0000 LBRA NVC0_Z1 ; chkrdy,quick,dinit,warm, floppy drive 0/1 dinit,warm,seek, ROM/RAM disc F324 5F NVC0_Z1 CLRB ;return with F325 5D TSTB ;N,V,C, clear & F326 1C FE ANDCC#$FE ;Z set. F328 39 RTS ; write sector,restore to track 00, ROMdisc. F329 C6 40 NVZ0_C1 LDB #$40 ;return with F32B 5D TSTB ;N,V,Z, clear & F32C 1A 01 ORCC #$01 ;C set F32E 39 RTS ; set DP to $FF,speed to fast F32F 1E8B FAST EXG A,DP ;save present DP F331 B7 DFF7 STA SPEED ; F334 86 FF LDA #$FF ;set DP = $FF F336 1E8B EXG A,DP ; F338 B7 FFD9 STA $FFD9 ;set Fast speed F33B 39 RTS ; restore DP,speed to slow F33C B7 FFD7 SLOW STA $FFD7 ;) set AD speed F33F B7 FFD8 STA $FFD8 ;) F342 7D 0000 TST $0000 ; F345 21 F5 BRN SLOW ; F347 B7 FFD6 STA $FFD6 ;set slow F34A B6 DFF7 LDA SPEED ;restore former DP F34D 1E8B EXG A,DP ; F34F 39 RTS ; read sector from ROMdisc (A=track,B=sector,X=addr.of a sector buffer) F350 8D DD BSR FAST ;DP=$FF,speed=fast. Convert T/S addr.into a Sector No. starting at zero. F352 5A DECB ;(1st sec. is 0) F353 3404 PSHS B ;make it TOS Calc.No.of sectors in preceeding tracks. (N.B. There are only 25.6 notional tracks on the Rom disc,so the result of the multiplication can always be held in one byte. ie.ACCB) F355 C6 0A LDB #$0A ;(sectors/track) F357 3D MUL ; Add buckshee sectors and remove them from stack. F358 EB E0 ADDB 0,S+ ;ACCB = Sector No. Init PIA F35A 86 90 LDA #$90 ;mode 0,ports F35C 97 1F STA BITCON ;A=in,B&C=out F35E 86 CF LDA #$CF ;deselect all Roms F360 97 1E STA PORTC ; F362 86 0B LDA #$0B ; F364 97 1F STA BITCON ;zero addr.counter F366 86 0A LDA #$0A ; F368 97 1F STA BITCON ; Calculate Rom addr. F36A 1F98 TFR B,A ;copy Sec.No. F36C C4 3F ANDB #$3F ;mask off multiples ;of 64 and use as F36E D7 1D STB PORTB ;high order addr. F370 84 C0 ANDA #$C0 ;recover Sec.No. & F372 44 LSRA ;calculate the F373 44 LSRA ;number of F374 44 LSRA ;'Romfuls' in it, F375 44 LSRA ;use this as index F376 44 LSRA ;to code table. F377 44 LSRA ; F378 3410 PSHS X ; F37A 8E F3A1 LDX #$F3A1 ;(code table) F37D E6 86 LDB A,X ;get code F37F D7 1F STB BITCON ;select correct Rom. F381 3510 PULS X ; F383 5F CLRB ;zero counter Transfer data. F384 86 0C LDA #$0C ; F386 97 1F STA BITCON ;output enable Roms F388 96 1C LDA PORTA ;get a byte F38A A7 80 STA 0,X+ ;put it in buffer F38C 86 09 LDA #$09 ; F38E 97 1F STA BITCON ;strobe counter F390 86 08 LDA #$08 ; F392 97 1F STA BITCON ; F394 5C INCB ;end of sector ? F395 26 F1 BNE $F388 ;no,continue F397 8D A3 BSR SLOW ;yes,reset DP & speed. F399 86 9B LDA #$9B ;make all PIA ports F39B B7 FF1F STA BITCON ;inputs. F39E 16 FF83 LBRA NVC0_Z1 ;set CC & RTS. F3A1 FCB $00,$02,$04,$06 chkrdy,quick, ROMdisc F3A5 4F CLRA ;select track 0, F3A6 C6 01 LDB #$01 ;sector 1. F3A8 8E DE80 LDX #BUFFER ; F3AB 8D A3 BSR $F350 ;read Romdisc F3AD FC DE80 LDD BUFFER ;peek 1st 2 bytes F3B0 1083 AA55 CMPD #$AA55 ; F3B4 26 03 BNE $F3B9 ;error,branch F3B6 16 FF6B LBRA NVC0_Z1 ; F3B9 C6 80 LDB #$80 ; F3BB 5D TSTB ; F3BC 1A 01 ORCC #$01 ;return with F3BE 39 RTS ;Z,V,clear, N,C,set read a sector from RAMdisc. (D=T/S addr. X=buffer addr.) F3BF BD F32F JSR FAST ;DP=$FF,speed=fast. F3C2 8D 27 BSR $F3EB ;set cursor to 1st word F3C4 86 4C LDA #$4C ;'figs' cmd. F3C6 BD F618 JSR GCOM ; F3C9 86 02 LDA #$02 ;dir=2,DC=128 (words) F3CB BD F62A JSR GPRM ; F3CE 86 80 LDA #$80 ; F3D0 BD F62A JSR GPRM ; F3D3 4F CLRA ; F3D4 BD F62A JSR GPRM ; F3D7 86 A0 LDA #$A0 ;'rdat' cmd. F3D9 BD F618 JSR GCOM ; F3DC 5F CLRB ;read 256 bytes F3DD BD F639 JSR GPRMI ;into buffer. F3E0 A7 80 STA 0,X+ ; F3E2 5A DECB ; F3E3 26 F8 BNE $F3DD ; F3E5 BD F33C JSR SLOW ;restore DP & speed. F3E8 16 FF39 LBRA NVC0_Z1 ; convert T/S addr. to ram addr. F3EB 3410 PSHS X ; F3ED 5A DECB ;(start at sector 0) F3EE 3404 PSHS B ; F3F0 C6 0A LDB #$0A ;calc. No.of sectors F3F2 3D MUL ;in previous tracks. F3F3 1F01 TFR D,X ; F3F5 3504 PULS B ;add No.of sectors F3F7 3A ABX ;in this track. F3F8 1F10 TFR X,D ; F3FA 58 ASLB ;mult by 128 to F3FB 49 ROLA ;give word No. F3FC 58 ASLB ;(16 bit words) F3FD 49 ROLA ; F3FE 58 ASLB ; F3FF 49 ROLA ; F400 58 ASLB ; F401 49 ROLA ; F402 58 ASLB ; F403 49 ROLA ; F404 58 ASLB ; F405 49 ROLA ; F406 58 ASLB ; F407 49 ROLA ; F408 1F01 TFR D,X ; F40A BD FA67 JSR SETCRT ; F40D 8E FFFF LDX #$FFFF ; F410 BD F644 JSR MASK ; F413 3590 PULS X,PC ; write a sector to RAMdisc F415 BD F32F JSR FAST ;DP=$FF,speed=fast. F418 3410 PSHS X ; F41A 8D CF BSR $F3EB ;T/S to Word adr. F41C 8E 0080 LDX #$0080 ;clr. 128 words, F41F 86 02 LDA #$02 ;(1 sector). F421 BD F875 JSR CLEARX ; F424 10BE DFE5 LDY CURSOR ; F428 86 4C LDA #$4C ;'figs' cmd. F42A BD F618 JSR GCOM ; F42D 86 02 LDA #$02 ;init.dir. = 2 F42F BD F62A JSR GPRM ; F432 C6 80 LDB #$80 ;word count F434 3510 PULS X ; F436 3410 PSHS X ; F438 1F21 TFR Y,X ; F43A BD FA67 JSR SETCRT ; F43D 3510 PULS X ; F43F 86 4A LDA #$4A ;'mask' cmd. F441 BD F618 JSR GCOM ; F444 A6 80 LDA 0,X+ ;get data byte F446 BD F62A JSR GPRM ;set mask-Hi F449 A6 80 LDA 0,X+ ;get data byte F44B BD F62A JSR GPRM ;set mask-Lo F44E 86 20 LDA #$20 ;'wdat' cmd. F450 BD F618 JSR GCOM ; F453 86 FF LDA #$FF ;word all 1's, F455 BD F62A JSR GPRM ;masked by data F458 BD F62A JSR GPRM ;bytes. F45B 31 21 LEAY $01,Y ; F45D 5A DECB ;all written ? F45E 26 D6 BNE $F436 ;no,continue. F460 BD F33C JSR SLOW ;restore DP & speed. F463 16 FEBE LBRA NVC0_Z1 ; verify,restore,drive,chkrdy,quick, RAMdisc F466 4F CLRA ;track 0 F467 C6 01 LDB #$01 ;sector 1 F469 8E DE80 LDX #BUFFER ; F46C 17 FF50 LBSR $F3BF ;read (Ramdisc). F46F FC DE80 LDD BUFFER ; F472 1083 AA55 CMPD #$AA55 ;cmp.1st 2 bytes F476 26 03 BNE $F47B ;error if not F478 16 FEA9 LBRA NVC0_Z1 ; F47B C6 80 LDB #$80 ;rtn. NC,1-ZV,0 F47D 5D TSTB ; F47E 1A 01 ORCC #$01 ; F480 39 RTS ; read a sector F481 6E 9FDFA1 READ JMP [REAVEC] ; write a sector F485 6E 9FDFA3 WRITE JMP [WRIVEC] ; verify a sector F489 6E 9FDFA5 VERIFY JMP [VERVEC] ; restore to track 00 F48D BD F497 RST JSR DRV ; F490 27 01 BEQ $F493 ; F492 39 RTS ; F493 6E 9FDFA7 JMP [RSTVEC] ; select drive F497 3430 DRV PSHS X,Y ;on entry,X=DRIVE-3 F499 E6 03 LDB $03,X ;ie. DRIVE F49B 8E DF9D LDX #DDSTAB ; F49E A6 85 LDA B,X ;look up physical D F4A0 81 FF CMPA #$FF ;allocated ? F4A2 26 08 BNE $F4AC ;yes,branch F4A4 3530 PULS X,Y ;not allocated F4A6 C6 0F LDB #$0F ;return with F4A8 5D TSTB ;C set & N,Z,V clear. F4A9 1A 01 ORCC #$01 ; F4AB 39 RTS ; F4AC C6 14 LDB #$14 ; F4AE 3D MUL ;(by physical D No.) F4AF 8E F1CA LDX #$F1CA ;base of table F4B2 30 8B LEAX D,X ;add offset F4B4 108E DFA1 LDY #REAVEC ;adr.of 1st.vector F4B8 C6 14 LDB #$14 ;load vectors F4BA A6 80 LDA 0,X+ ; F4BC A7 A0 STA 0,Y+ ; F4BE 5A DECB ; F4BF 26 F9 BNE $F4BA ; F4C1 3530 PULS X,Y ; F4C3 6E 9FDFA9 JMP [DRVVEC] ; check for drive ready F4C7 6E 9FDFAB CHKRDY JMP [CHKVEC] ; quick check for drv ready F4CB 6E 9FDFAD QUICK JMP [QUIVEC] ; drive cold start F4CF 4F DINIT CLRA ;start at logical 0 F4D0 B7 DF8E STA DRIVE ; F4D3 8E DF8B LDX #DRIVE-3 ; F4D6 8D BF BSR DRV ;sets vectors F4D8 25 04 BCS $F4DE ;not allocated,skip F4DA AD 9FDFAF JSR [INIVEC] ; F4DE B6 DF8E LDA DRIVE ;init next drive, F4E1 4C INCA ;until all done. F4E2 81 04 CMPA #$04 ; F4E4 26 EA BNE $F4D0 ; F4E6 39 RTS ; drive warm start F4E7 6E 9FDFB1 WARM JMP [WARVEC] ; seek to track/sector F4EB 6E 9FDFB3 SEEK JMP [SEEVEC] ; print a crlf F4EF FCB $0A,$0D,$04 ;LF,CR,EOT F4F2 3410 PCRLF PSHS X ; F4F4 8E F4FE LDX #$F4EF ; F4F7 8D 05 BSR PDATA1 ; F4F9 3590 PULS X,PC ; print string terminated by $04 F4FB BD F16E JSR OUTCH ; F4FE A6 80 PDATA1 LDA 0,X+ ; F500 81 04 CMPA #$04 ; F502 26 F7 BNE $F4FB ; F504 39 RTS ; pcrlf followed by pdata1 F505 8D EB PSTRNG BSR PCRLF ; F507 8D F5 BSR PDATA1 ; F509 39 RTS ; output ACCA as 2 hex digits + space F50A 3416 PRINTA PSHS A,B,X ; F50C B7 DF91 STA TEMP ; F50F 8E DF91 LDX #TEMP ; F512 8D 76 BSR OUT2HS ; F514 3596 PULS A,B,X,PC ; output Xreg as 4 hex digits + space F516 3416 PRINTX PSHS A,B,X ; F518 BF DF92 STX XTEMP ; F51B 8E DF92 LDX #XTEMP ; F51E 8D 68 BSR OUT4HS ; F520 3596 PULS A,B,X,PC ; delay for (Xreg) mSecs F522 3436 DELAY PSHS A,B,X,Y ; F524 108E 0034 LDY #$0034 ; F528 3D MUL ; F529 31 3F LEAY -$01,Y ; F52B 26 FB BNE $F528 ; F52D 30 1F LEAX -$01,X ; F52F 26 F3 BNE $F524 ; F531 35B6 PULS A,B,X,Y,PC ; build a 4 digit hex address into Xreg F533 8D 09 BADDR BSR BYTE ; F535 1F89 TFR A,B ; F537 8D 05 BSR BYTE ; F539 1E89 EXG A,B ; F53B 1F01 TFR D,X ; F53D 39 RTS ; get a 2 digit hex value into ACCA F53E 3404 BYTE PSHS B ; F540 8D 21 BSR INHEX ;get m.s digit F542 48 LSLA ;mult. by 16 F543 48 LSLA ; F544 48 LSLA ; F545 48 LSLA ; F546 1F89 TFR A,B ;put it in B F548 8D 19 BSR INHEX ;get l.s digit F54A 3404 PSHS B ;add them via stack F54C AB E0 ADDA 0,S+ ;and tidy stack F54E 3584 PULS B,PC ; output left hex digit of ACCA F550 44 OUTHL LSRA ;divide by 16 F551 44 LSRA ; F552 44 LSRA ; F553 44 LSRA ; F554 84 0F OUTHR ANDA #$0F ; F556 8B 30 ADDA #$30 ;binary to ascii F558 81 39 CMPA #$39 ;was it alpha ? F55A 1023 FC10 LBLS OUTCH ;no,print it F55E 8B 07 ADDA #$07 ;yes,adjust ascii F560 7E F16E JMP OUTCH ;then print it get a 1 digit hex value into ACCA F563 BD F16C INHEX JSR INCH ; F566 80 30 SUBA #$30 ;less than zero ? F568 2B 0F BMI $F579 ;yes,invalid,delete F56A 81 09 CMPA #$09 ;no,more than 9 ? F56C 2F 0A BLE $F578 ;no,was 0-9,OK,rtn. F56E 81 11 CMPA #$11 ;yes, A-F ? F570 2B 07 BMI $F579 ;invalid if not F572 81 16 CMPA #$16 ; F574 2E 03 BGT $F579 ; F576 80 07 SUBA #$07 ;else adjust binary F578 39 RTS ; F579 86 08 LDA #$08 ;send a backspace F57B BD F16E JSR OUTCH ;(ie. delete) F57E 20 E3 BRA INHEX ;& ask for another output 2/4 hex chars,pointed to by Xreg,with/without space F580 A6 84 OUT2H LDA 0,X ; F582 8D CC BSR OUTHL ; F584 A6 80 LDA 0,X+ ; F586 20 CC BRA OUTHR ; F588 8D F6 OUT4HS BSR OUT2H ; F58A 8D F4 OUT2HS BSR OUT2H ; F58C 86 20 LDA #$20 ; F58E 7E F16E JMP OUTCH ; return a random number in ACCA. F591 3404 PSHS B ; F593 C6 08 LDB #$08 ; F595 B6 DF9B LDA RNDM+3 ; F598 48 LSLA ; F599 48 LSLA ; F59A 48 LSLA ; F59B B8 DF9B EORA RNDM+3 ; F59E 48 LSLA ; F59F 48 LSLA ; F5A0 79 DF98 ROL RNDM ; F5A3 79 DF99 ROL RNDM+1 ; F5A6 79 DF9A ROL RNDM+2 ; F5A9 79 DF9B ROL RNDM+3 ; F5AC 5A DECB ; F5AD 26 E6 BNE $F595 ; F5AF B6 DF98 LDA RNDM ; F5B2 3584 PULS B,PC ; get time string from RTC F5B4 3416 GETTIM PSHS A,B,X ; F5B6 C6 0A LDB #$0A ; F5B8 8D 07 BSR GETRTC ; F5BA A7 80 STA 0,X+ ; F5BC 5A DECB ; F5BD 26 F9 BNE $F5B8 ; F5BF 3596 PULS A,B,X,PC ; get a byte from RTC F5C1 86 0A GETRTC LDA #$0A ;peek register A F5C3 B7 FF18 STA RTCADD ; F5C6 B6 FF19 LDA RTCDAT ; F5C9 2B F6 BMI GETRTC ;wait for valid data F5CB F7 FF18 STB RTCADD ;set reqd.addr. F5CE B6 FF19 LDA RTCDAT ;get data F5D1 39 RTS ; put time string to RTC F5D2 3416 PUTTIM PSHS A,B,X ; F5D4 C6 0A LDB #$0A ; F5D6 A6 80 LDA 0,X+ ; F5D8 8D 05 BSR PUTRTC ; F5DA 5A DECB ; F5DB 26 F9 BNE $F5D6 ; F5DD 3596 PULS A,B,X,PC ; put a byte to RTC F5DF 3402 PUTRTC PSHS A ;save data F5E1 86 0A LDA #$0A ;peek register A F5E3 B7 FF18 STA RTCADD ; F5E6 B6 FF19 LDA RTCDAT ; F5E9 2B F6 BMI $F5E1 ;wait for end of update F5EB F7 FF18 STB RTCADD ;set addr. F5EE 3502 PULS A ;recover data F5F0 B7 FF19 STA RTCDAT ;store it F5F3 39 RTS ; sound a tone F5F4 3412 BEEP PSHS A,X ; F5F6 B6 FF02 LDA SYSREG ; F5F9 8A 08 ORA #$08 ; F5FB B7 FF02 STA SYSREG ; F5FE 8E 0064 LDX #$0064 ; F601 BD F522 JSR DELAY ; F604 B6 FF02 LDA SYSREG ; F607 84 F7 ANDA #$F7 ; F609 B7 FF02 STA SYSREG ; F60C 3592 PULS A,X,PC ; enter from monitor JF cmd. on entry X=CD00 or CD03 F60E B6 FF02 MAPRAM LDA SYSREG ; F611 84 FB ANDA #$FB ;set "MAP"=0 (ram) F613 B7 FF02 STA SYSREG ; F616 6E 84 JMP 0,X ;Flex cold/warm send a command to GDC F618 4D GCOM TSTA ;is it 'reset' ? F619 27 0B BEQ $F626 ;yes,send at once F61B 3402 PSHS A ;else,save cmd. F61D B6 FF14 LDA GDCPRM ;get status F620 85 04 BITA #$04 ;FIFO empty ? F622 27 F9 BEQ $F61D ;no,wait F624 3502 PULS A ;recover command F626 B7 FF15 STA GDCCOM ;send it F629 39 RTS ; send a parameter to GDC F62A 3402 GPRM PSHS A ;store parameter F62C B6 FF14 LDA GDCPRM ;get status F62F 85 04 BITA #$04 ;FIFO empty ? F631 27 F9 BEQ $F62C ;no,wait F633 3502 PULS A ;recover parameter F635 B7 FF14 STA GDCPRM ;send it F638 39 RTS ; get a parameter from GDC F639 B6 FF14 GPRMI LDA GDCPRM ;get status F63C 85 01 BITA #$01 ;data ready ? F63E 27 F9 BEQ GPRMI ;no,wait F640 B6 FF15 LDA GDCCOM ;read FIFO F643 39 RTS ; load the mask register F644 3406 MASK PSHS A,B ; F646 86 4A LDA #$4A ;send 'mask' command F648 8D CE BSR GCOM ; F64A 1F10 TFR X,D ;get mask bytes F64C 1E89 EXG A,B ;reverse for FIFO F64E 8D DA BSR GPRM ;send 2nd. F650 1E89 EXG A,B ; F652 8D D6 BSR GPRM ;send 1st. F654 3586 PULS A,B,PC ; define drawing mode F656 3416 SETPEN PSHS A,B,X ; F658 84 03 ANDA #$03 ;setup 'w.data' cmd. F65A 8A 20 ORA #$20 ; F65C 8D BA BSR GCOM ;send it F65E 1F10 TFR X,D ;get 'profile' word F660 F7 DFC4 STB GPARAM+1 ;save it F663 B7 DFC3 STA GPARAM ; F666 8E DFBD LDX #PART1+2 ; F669 8D 02 BSR SETPAT ; F66B 3596 PULS A,B,X,PC ; define graphics pattern F66D 3416 SETPAT PSHS A,B,X ; F66F 86 78 LDA #$78 ;'pram' cmd.starting ;with param.No.8 F671 8D A5 BSR GCOM ;send command F673 C6 08 LDB #$08 ;load 8 parameters, F675 30 08 LEAX $08,X ;taken from ram F677 A6 82 LDA 0,-X ;pointed to by X, F679 8D AF BSR GPRM ;in reverse,(FIFO), F67B 5A DECB ;order. F67C 26 F9 BNE $F677 ; F67E 3596 PULS A,B,X,PC ; start figure drawing F680 3416 FIGSF PSHS A,B,X ; Load [B] drawing parameters from scratch ram to GDCRAM NB. All 2-byte parameters are loaded low byte first to maintain Fifo stack. F682 86 4C LDA #$4C ;'figs' command F684 8D 92 BSR GCOM ; F686 8E DFCD LDX #GFIGS ; F689 A6 84 LDA 0,X ; F68B 8D 9D BSR GPRM ; F68D 5A DECB ; F68E 27 0E BEQ $F69E ; F690 A6 02 LDA $02,X ; F692 8D 96 BSR GPRM ; F694 A6 01 LDA $01,X ; F696 30 02 LEAX $02,X ; F698 8D 90 BSR GPRM ; F69A 5A DECB ; F69B 5A DECB ; F69C 26 F2 BNE $F690 ; Load the GDCRAM into the drawing processor & draw. F69E 86 6C LDA #$6C ;'figd' command F6A0 17 FF75 LBSR GCOM ; F6A3 3596 PULS A,B,X,PC ; start graphics drawing Load [B] drawing parameters from scratch ram to GDCRAM NB. All 2-byte parameters are loaded low byte first to maintain Fifo stack. F6A5 3416 FIGSG PSHS A,B,X ; F6A7 86 4C LDA #$4C ; F6A9 17 FF6C LBSR GCOM ; F6AC 8E DFCD LDX #GFIGS ; F6AF A6 84 LDA 0,X ; F6B1 17 FF76 LBSR GPRM ; F6B4 5A DECB ; F6B5 27 10 BEQ $F6C7 ; F6B7 A6 02 LDA $02,X ; F6B9 17 FF6E LBSR GPRM ; F6BC A6 01 LDA $01,X ; F6BE 30 02 LEAX $02,X ; F6C0 17 FF67 LBSR GPRM ; F6C3 5A DECB ; F6C4 5A DECB ; F6C5 26 F0 BNE $F6B7 ; Fill area to pattern stored in GDCRAM. (ie. Draw graphics character). F6C7 86 68 LDA #$68 ;'gchrd' command F6C9 17 FF4C LBSR GCOM ; F6CC 3596 PULS A,B,X,PC ; define display partitions on entry, X=Pt.1 start D=Pt.2 start Y=Pt.1 length U=Pt.2 length F6CE 3476 SETPAR PSHS A,B,X,Y,U ; F6D0 1E89 EXG A,B ; F6D2 FD DFBF STD PART2 ; F6D5 1F10 TFR X,D ; F6D7 1E89 EXG A,B ; F6D9 FD DFBB STD PART1 ; F6DC 1F20 TFR Y,D ; F6DE C4 0F ANDB #$0F ;mask off Hi nibble F6E0 86 10 LDA #$10 ;shift into F6E2 3D MUL ;Hi nibble to form F6E3 F7 DFBD STB PART1+2 ;Lo field of length F6E6 1F20 TFR Y,D ;recover length F6E8 44 LSRA ;shove the last 4 F6E9 56 RORB ;bits overboard,(we F6EA 44 LSRA ;have already dealt F6EB 56 RORB ;with these),use F6EC 44 LSRA ;the remaining bits as F6ED 56 RORB ; F6EE 44 LSRA ; F6EF 56 RORB ; F6F0 F7 DFBE STB PART1+3 ;Hi field of length. F6F3 1F30 TFR U,D ;get Pt.2 length & F6F5 C4 0F ANDB #$0F ;treat as above. F6F7 86 10 LDA #$10 ; F6F9 3D MUL ; F6FA F7 DFC1 STB PART2+2 ; F6FD 1F30 TFR U,D ; F6FF 44 LSRA ; F700 56 RORB ; F701 44 LSRA ; F702 56 RORB ; F703 44 LSRA ; F704 56 RORB ; F705 44 LSRA ; F706 56 RORB ; F707 F7 DFC2 STB PART2+3 ; F70A 8D 14 BSR SYNC ;wait for sync. F70C 86 70 LDA #$70 ;'pram' cmd. F70E 17 FF07 LBSR GCOM ; F711 8E DFBB LDX #PART1 ;transfer 8 params F714 C6 08 LDB #$08 ;from scratch to GDC. F716 A6 80 LDA 0,X+ ; F718 17 FF0F LBSR GPRM ; F71B 5A DECB ; F71C 26 F8 BNE $F716 ; F71E 35F6 PULS A,B,X,Y,U,PC ; sync to vertical blanking F720 3402 SYNC PSHS A ; F722 B6 FF14 LDA GDCPRM ; F725 85 20 BITA #$20 ; F727 26 F9 BNE $F722 ; F729 B6 FF14 LDA GDCPRM ; F72C 85 20 BITA #$20 ; F72E 27 F9 BEQ $F729 ; F730 3582 PULS A,PC ; set graphics cursor F732 3436 SETCRG PSHS A,B,X,Y ; F734 BF DFB7 STX XCOORD ; F737 10BF DFB9 STY YCOORD ; F73B 86 49 LDA #$49 ;'curs' cmd. F73D 17 FED8 LBSR GCOM ; F740 1F20 TFR Y,D ; F742 58 ASLB ;mult Y-coord by 48 F743 49 ROLA ;to yield number of F744 58 ASLB ;words,(16 bit), in F745 49 ROLA ;previous lines. F746 58 ASLB ; F747 49 ROLA ; F748 58 ASLB ; F749 49 ROLA ; F74A 1F02 TFR D,Y ; F74C 58 ASLB ; F74D 49 ROLA ; F74E 31 AB LEAY D,Y ; F750 1F10 TFR X,D ; F752 44 LSRA ;divide X-coord by 16 F753 56 RORB ;to yield number of F754 44 LSRA ;complete words on F755 56 RORB ;this line.Add addr F756 44 LSRA ;of 1st word in F757 56 RORB ;Partition,to get F758 44 LSRA ;addr of current word. F759 56 RORB ; F75A 31 AB LEAY D,Y ; F75C 31 A95E00 LEAY $5E00,Y ; F760 58 ASLB ;recover X-coord but F761 49 ROLA ;with l.s. nibble F762 58 ASLB ;set to 0. Subtract F763 49 ROLA ;to yield number of F764 58 ASLB ;bits in current word. F765 49 ROLA ; F766 58 ASLB ; F767 49 ROLA ; F768 43 COMA ; F769 53 COMB ; F76A C3 0001 ADDD #$0001 ; F76D 30 8B LEAX D,X ; F76F 1F20 TFR Y,D ;format to suit GDC F771 1E89 EXG A,B ;parameter ram and F773 17 FEB4 LBSR GPRM ;load parameters. F776 1E89 EXG A,B ; F778 17 FEAF LBSR GPRM ; F77B 1F10 TFR X,D ; F77D 86 10 LDA #$10 ; F77F 3D MUL ; F780 C4 F0 ANDB #$F0 ; F782 1F98 TFR B,A ; F784 17 FEA3 LBSR GPRM ; F787 35B6 PULS A,B,X,Y,PC ; get graphics cursor F789 3406 GETCRG PSHS A,B ; F78B 86 E0 LDA #$E0 ;'curd' cmd. F78D 17 FE88 LBSR GCOM ; F790 17 FEA6 LBSR GPRMI ;get cursor word adr. F793 1F89 TFR A,B ; F795 17 FEA1 LBSR GPRMI ; F798 108E 0000 LDY #$0000 ;zero line count F79C 83 5E00 SUBD #$5E00 ;convert to word #. F79F 83 0030 SUBD #$0030 ;count lines. F7A2 2B 04 BMI $F7A8 ; F7A4 31 21 LEAY $01,Y ; F7A6 20 F7 BRA $F79F ; F7A8 C3 0030 ADDD #$0030 ; F7AB 58 ASLB ;convert 'words on F7AC 49 ROLA ;current line' to F7AD 58 ASLB ;'bits on current line' F7AE 49 ROLA ; F7AF 58 ASLB ; F7B0 49 ROLA ; F7B1 58 ASLB ; F7B2 49 ROLA ; F7B3 1F01 TFR D,X ;save in X. F7B5 17 FE81 LBSR GPRMI ;Hi adr.bits.Discard. F7B8 17 FE7E LBSR GPRMI ;get dot addr. F7BB 1F89 TFR A,B ;(in 1 of 16 form) F7BD 17 FE79 LBSR GPRMI ; F7C0 1C FE ANDCC#$FE ;clear carry F7C2 44 LSRA ;count buckshee bits F7C3 56 RORB ;and increment X F7C4 25 04 BCS $F7CA ;accordingly. F7C6 30 01 LEAX $01,X ; F7C8 20 F8 BRA $F7C2 ; F7CA BF DFB7 STX XCOORD ;store coordinates. F7CD 10BF DFB9 STY YCOORD ; F7D1 3586 PULS A,B,PC ; turn display off F7D3 3402 OFF PSHS A ; F7D5 BD F720 JSR SYNC ; F7D8 86 0C LDA #$0C ; F7DA 17 FE3B LBSR GCOM ; F7DD 3582 PULS A,PC ; turn display on F7DF 3402 ON PSHS A ; F7E1 BD F720 JSR SYNC ; F7E4 86 0D LDA #$0D ; F7E6 17 FE2F LBSR GCOM ; F7E9 3582 PULS A,PC ; set display to graphics F7EB 3476 GRAPH PSHS A,B,X,Y,U ; F7ED 5F CLRB ; F7EE 8D 16 BSR MODE ; F7F0 8A 09 ORA #$09 ; F7F2 5A DECB ; F7F3 8D 11 BSR MODE ;set interlaced. F7F5 8E 5E00 LDX #$5E00 ;set Partitions. F7F8 108E 0240 LDY #$0240 ; F7FC CC 0000 LDD #$0000 ; F7FF 1F03 TFR D,U ; F801 BD F6CE JSR SETPAR ; F804 35F6 PULS A,B,X,Y,U,PC ; set GDC mode F806 5D MODE TSTB ; F807 27 10 BEQ $F819 ; F809 B7 DFCB STA GMODE ; F80C 3402 PSHS A ; F80E 86 0F LDA #$0F ;'sync'command F810 17 FE05 LBSR GCOM ; F813 3502 PULS A ; F815 17 FE12 LBSR GPRM ; F818 39 RTS ; F819 B6 DFCB LDA GMODE ; F81C 39 RTS ; set zoom factor F81D 5D ZOOM TSTB ; F81E 27 10 BEQ $F830 ; F820 B7 DFCC STA GZOOM ; F823 3402 PSHS A ; F825 86 46 LDA #$46 ;'zoom'command F827 17 FDEE LBSR GCOM ; F82A 3502 PULS A ; F82C 17 FDFB LBSR GPRM ; F82F 39 RTS ; F830 B6 DFCC LDA GZOOM ; F833 39 RTS ; area fill. (On entry, A holds init dir). F834 3436 FILL PSHS A,B,X,Y ; F836 84 87 ANDA #$87 ;set 'figs' P1 for F838 8A 10 ORA #$10 ;graphics char. F83A B7 DFCD STA GFIGS ; F83D 31 3F LEAY -$01,Y ;DC=(No.of pixels at F83F 1F20 TFR Y,D ;Rt.Angles to initial F841 FD DFCE STD DC ;direction - 1). F844 1F10 TFR X,D ;D & D2=(No.of pixels F846 FD DFD0 STD D ;in initial direction). F849 FD DFD2 STD D2 ; F84C C6 07 LDB #$07 ;load 7 bytes from F84E 17 FE54 LBSR FIGSG ;scratch,then draw. F851 35B6 PULS A,B,X,Y,PC ; clear graphics display F853 3436 CLEARG PSHS A,B,X,Y ; F855 8E 0000 LDX #$0000 ;set cursor 0,0 F858 1F12 TFR X,Y ; F85A BD F732 JSR SETCRG ; F85D 8E 4000 LDX #$4000 ;(DCmax=$3FFF) F860 86 02 LDA #$02 ;pen type 'reset' F862 8D 11 BSR CLEARX ;clear this block F864 8E 2C30 LDX #$2C30 ;now do rest F867 86 02 LDA #$02 ; F869 8D 0A BSR CLEARX ; F86B 8E 0000 LDX #$0000 ;and reset cursor F86E 1F12 TFR X,Y ;to 0,0. F870 BD F732 JSR SETCRG ; F873 35B6 PULS A,B,X,Y,PC ; clear (Xreg) words of display memory F875 3412 CLEARX PSHS A,X ; F877 3402 PSHS A ; F879 30 1F LEAX -$01,X ;(DC=W-1) F87B 3410 PSHS X ; F87D 8E FFFF LDX #$FFFF ;enable all bits F880 BD F644 JSR MASK ; F883 86 4C LDA #$4C ;'figs'command F885 17 FD90 LBSR GCOM ; F888 86 02 LDA #$02 ;P1.wdata mode,dir 2. F88A 17 FD9D LBSR GPRM ; F88D 3506 PULS A,B ; F88F 1E89 EXG A,B ; F891 17 FD96 LBSR GPRM ;P2.DC-low F894 1E89 EXG A,B ; F896 17 FD91 LBSR GPRM ;P3.DC-hi F899 3502 PULS A ;(pen type 02) F89B 8A 20 ORA #$20 ;'wdat' command F89D 17 FD78 LBSR GCOM ; F8A0 86 FF LDA #$FF ; F8A2 17 FD85 LBSR GPRM ;data word all 1's. F8A5 17 FD82 LBSR GPRM ; F8A8 3592 PULS A,X,PC ; initialise GDC F8AA 3416 GDCINI PSHS A,B,X ; F8AC 4F CLRA ; F8AD 17 FD68 LBSR GCOM ;'reset' command F8B0 7D DFB5 TST RTCFAIL ;RTC data valid ? F8B3 27 12 BEQ $F8C7 ;no,get defaults F8B5 C6 21 LDB #$21 ;yes,load parameter F8B7 BD F5C1 JSR GETRTC ;ram from RTC. F8BA BD F62A JSR GPRM ; F8BD 5C INCB ; F8BE C1 29 CMPB #$29 ; F8C0 26 F5 BNE $F8B7 ; F8C2 8E F917 LDX #$F917 ; F8C5 20 12 BRA $F8D9 ; F8C7 8E F90F LDX #$F90F ;look up defaults F8CA C6 21 LDB #$21 ; F8CC A6 80 LDA 0,X+ ;put them in F8CE 17 FD59 LBSR GPRM ;parameter ram F8D1 BD F5DF JSR PUTRTC ;and RTC. F8D4 5C INCB ; F8D5 C1 29 CMPB #$29 ; F8D7 26 F3 BNE $F8CC ; F8D9 86 6F LDA #$6F ;'vsync' command F8DB 17 FD3A LBSR GCOM ; F8DE 86 47 LDA #$47 ;'pitch' command F8E0 17 FD35 LBSR GCOM ; F8E3 A6 80 LDA 0,X+ ; F8E5 17 FD42 LBSR GPRM ; F8E8 86 4B LDA #$4B ;'cchar' command F8EA 17 FD2B LBSR GCOM ; F8ED C6 03 LDB #$03 ; F8EF A6 80 LDA 0,X+ ; F8F1 17 FD36 LBSR GPRM ; F8F4 5A DECB ; F8F5 26 F8 BNE $F8EF ; F8F7 C6 01 LDB #$01 ; F8F9 4F CLRA ; F8FA 17 FF20 LBSR ZOOM ; F8FD 86 1F LDA #$1F ; F8FF B7 DFCB STA GMODE ; F902 86 6B LDA #$6B ;'start' command F904 17 FD11 LBSR GCOM ; F907 BD FABC JSR CLEART ; F90A BD FA9E JSR TEXT ; F90D 3596 PULS A,B,X,PC ; F90F FCB $1F,$2E,$65,$0C,$05,$0F,$20,$7D ;GDC defaults F917 FCB $30 ;pitch param(48 dec) F918 FCB $00,$C0,$00 ;cchar parameters. plot a point F91B 3404 point PSHS B ; F91D 7F DFCD CLR GFIGS ;figure type = dot. F920 C6 01 LDB #$01 ; F922 17 FD5B LBSR FIGSF ; F925 3584 PULS B,PC ; plot a line F927 3456 line PSHS A,B,X,U ; F929 CE F99F LDU #$F99F ;base adr.of P1 table. F92C 1F10 TFR X,D ;calc X' (delta X) F92E B3 DFB7 SUBD XCOORD ; F931 1083 0000 CMPD #$0000 ; F935 2E 07 BGT $F93E ;branch if X'>0. F937 33 44 LEAU $04,U ;else,reverse dir. & F939 43 COMA ;change sign of X'. F93A 53 COMB ; F93B C3 0001 ADDD #$0001 ; F93E 1F01 TFR D,X ;X=|X'| F940 1F20 TFR Y,D ;repeat for Y-axis. F942 B3 DFB9 SUBD YCOORD ; F945 1083 0000 CMPD #$0000 ; F949 2E 07 BGT $F952 ; F94B 33 42 LEAU $02,U ; F94D 43 COMA ; F94E 53 COMB ; F94F C3 0001 ADDD #$0001 ; F952 FD DF94 STD YTEMP ; F955 BF DF92 STX XTEMP ; F958 BC DF94 CMPX YTEMP ; F95B 2E 08 BGT $F965 ; F95D 33 41 LEAU $01,U ; F95F BF DF94 STX YTEMP ; F962 FD DF92 STD XTEMP ; At this point,XTEMP=delta large,YTEMP=delta small. F965 A6 C4 LDA 0,U ;get P1 F967 B7 DFCD STA GFIGS ;put it in scratch. F96A FC DF94 LDD YTEMP ;calc --- F96D B3 DF92 SUBD XTEMP ;2(delta min - F970 58 ASLB ; delta max) F971 49 ROLA ; F972 84 3F ANDA #$3F ;NOT > 63 F974 FD DFD2 STD D2 ;store it. F977 FC DF94 LDD YTEMP ; F97A 58 ASLB ; F97B 49 ROLA ; F97C FD DFD4 STD D1 ;= 2(delta min). F97F B3 DF92 SUBD XTEMP ;2xdelta min-delta max. F982 84 3F ANDA #$3F ;NOT > 63 F984 FD DFD0 STD D ;store it. F987 FC DF92 LDD XTEMP ; F98A FD DFCE STD DC ;= delta max. F98D C6 09 LDB #$09 ;load 9 params & F98F 17 FCEE LBSR FIGSF ;draw line. F992 3556 PULS A,B,X,U ; F994 BF DFB7 STX XCOORD ;recover new F997 10BF DFB9 STY YCOORD ;coordinates and F99B 17 FD94 LBSR SETCRG ;update cursor. F99E 39 RTS ; 'figs' P1 table. (Select initial direction). 1 0 2 3 6 7 5 4 F99F FCB $09,$08,$0A,$0B,$0E,$0F,$0D,$OC plot a rectangle F9A7 3436 RECT PSHS A,B,X,Y ; F9A9 84 07 ANDA #$07 ;init.dir. (7 max) F9AB 8A 40 ORA #$40 ;set 'rectangle' bit. F9AD B7 DFCD STA GFIGS ;store as P1 for 'figs'. F9B0 CC 0003 LDD #$0003 ;sides - 1. F9B3 FD DFCE STD DC ; F9B6 30 1F LEAX -$01,X ; F9B8 31 3F LEAY -$01,Y ; F9BA 1F10 TFR X,D ;pix.in init dir. -1. F9BC FD DFD0 STD D ; F9BF FD DFD6 STD DM ; F9C2 1F20 TFR Y,D ;pix at Rt.A -1. F9C4 FD DFD2 STD D2 ; F9C7 CC FFFF LDD #$FFFF ;(-1) F9CA FD DFD4 STD D1 ; F9CD C6 0B LDB #$0B ;load 11 params & F9CF 17 FCAE LBSR FIGSF ;draw rectangle. F9D2 35B6 PULS A,B,X,Y,PC ; plot a circle F9D4 3436 circle PSHS A,B,X,Y ; F9D6 BE DFB7 LDX XCOORD ;get coordinates of F9D9 10BE DFB9 LDY YCOORD ;centre point. F9DD BF DF92 STX XTEMP ;save them. F9E0 10BF DF94 STY YTEMP ; F9E4 30 86 LEAX A,X ;add rad to X-coord. F9E6 C6 04 LDB #$04 ;dir = 4. F9E8 8D 3C BSR ARC ;0-45 degrees. F9EA C6 07 LDB #$07 ;dir = 7. F9EC 8D 38 BSR ARC ;0-315 degrees. F9EE BE DF92 LDX XTEMP ;set X-coord to centre. F9F1 31 A6 LEAY A,Y ;add rad to Y-coord. F9F3 C6 02 LDB #$02 ;dir = 2. F9F5 8D 2F BSR ARC ;270-315 degrees. F9F7 C6 05 LDB #$05 ;dir = 5. F9F9 8D 2B BSR ARC ;270-225 degrees. F9FB 10BE DF94 LDY YTEMP ;set Y-coord to centre. F9FF 40 NEGA ; FA00 30 86 LEAX A,X ;sub rad from X-coord. FA02 40 NEGA ; FA03 C6 00 LDB #$00 ; FA05 8D 1F BSR ARC ;180-225 degrees. FA07 C6 03 LDB #$03 ;dir = 3. FA09 8D 1B BSR ARC ;180-135 degrees. FA0B BE DF92 LDX XTEMP ;set X-coord to centre. FA0E 40 NEGA ; FA0F 31 A6 LEAY A,Y ;sub rad from Y-coord. FA11 40 NEGA ; FA12 C6 01 LDB #$01 ;dir = 1. FA14 8D 10 BSR ARC ;90-45 degrees. FA16 C6 06 LDB #$06 ;dir = 6. FA18 8D 0C BSR ARC ;90-135 degrees. FA1A BE DF92 LDX XTEMP ;recover coordinates FA1D 10BE DF94 LDY YTEMP ;of centre point & FA21 17 FD0E LBSR SETCRG ;set cursor. FA24 35B6 PULS A,B,X,Y,PC ; plot an arc. ( On entry, A = radius, B = initial direction). FA26 3406 ARC PSHS A,B ; FA28 17 FD07 LBSR SETCRG ; FA2B 3406 PSHS A,B ; FA2D C6 B5 LDB #$B5 ;(0.707 X 256) FA2F 3D MUL ; FA30 B7 DFD8 STA CONST ;256(R X 0.707).[Hi byte] FA33 3506 PULS A,B ; FA35 C4 07 ANDB #$07 ;dir not > 7. FA37 CA 20 ORB #$20 ;set 'arc' mode. FA39 F7 DFCD STB GFIGS ; FA3C 4A DECA ;radius - 1. FA3D C6 00 LDB #$00 ; FA3F B7 DFD1 STA D+1 ;Lo-byte of D = rad-1. FA42 F7 DFD0 STB D ;Hi-byte of D = 0. FA45 1E89 EXG A,B ; FA47 58 ASLB ; FA48 49 ROLA ; FA49 FD DFD2 STD D2 ;= 2(radius - 1). FA4C F6 DFD8 LDB CONST ; FA4F 86 00 LDA #$00 ; FA51 FD DFCE STD DC ;= R x 0.707 FA54 CC FFFF LDD #$FFFF ; FA57 FD DFD4 STD D1 ;= -1. FA5A CC 0000 LDD #$0000 ; FA5D FD DFD6 STD DM ; FA60 C6 0B LDB #$0B ;load 11 params & FA62 17 FC1B LBSR FIGSF ;draw arc. FA65 3586 PULS A,B,PC ; set text cursor FA67 3416 SETCRT PSHS A,B,X ; FA69 BF DFE5 STX CURSOR ; FA6C 86 49 LDA #$49 ;'curs' command FA6E 17 FBA7 LBSR GCOM ; FA71 1F10 TFR X,D ; FA73 1E89 EXG A,B ; FA75 17 FBB2 LBSR GPRM ;P1/2=cursor word FA78 1E89 EXG A,B ;adr. Lo/Hi. FA7A 17 FBAD LBSR GPRM ; FA7D 3596 PULS A,B,X,PC ; get text cursor FA7F 3406 GETCRT PSHS A,B ; FA81 86 E0 LDA #$E0 ;'curd' command FA83 17 FB92 LBSR GCOM ; FA86 17 FBB0 LBSR GPRMI ;P1=word adr. Lo FA89 1F89 TFR A,B ; FA8B 17 FBAB LBSR GPRMI ;P2=word adr. Hi FA8E 1F01 TFR D,X ; FA90 BF DFE5 STX CURSOR ;curs.word adr. FA93 17 FBA3 LBSR GPRMI ;P3=adr.Hi(not used) FA96 17 FBA0 LBSR GPRMI ;P4/5=dot adr.Lo/Hi FA99 17 FB9D LBSR GPRMI ;not used in text FA9C 3586 PULS A,B,PC ;mode,discard. set display to text FA9E 3476 TEXT PSHS A,B,X,Y,U ; FAA0 5F CLRB ; FAA1 17 FD62 LBSR MODE ;get mode. FAA4 84 F6 ANDA #$F6 ; FAA6 5C INCB ; FAA7 17 FD5C LBSR MODE ;set noninterlaced. FAAA BE DFEC LDX TS1 ;get text FAAD FC DFEE LDD TS2 ;Partition params. FAB0 10BE DFF0 LDY TL1 ; FAB4 FE DFF2 LDU TL2 ; FAB7 BD F6CE JSR SETPAR ;load them. FABA 35F6 PULS A,B,X,Y,U,PC ; clear text display FABC 3416 cleart PSHS A,B,X ; FABE 8E CA00 LDX #$CA00 ;point to text ram. FAC1 8D A4 BSR SETCRT ; FAC3 8E 3600 LDX #$3600 ;288 lines X 48 words. FAC6 86 02 LDA #$02 ; FAC8 BD F875 JSR CLEARX ;clear text. FACB 8D 20 BSR $FAED ;setup initial text ;Partition data in ;scratch ram. FACD 7F DFDA CLR COL ;home cursor. FAD0 7F DFD9 CLR ROW ; FAD3 7F DFEB CLR ESCFLG ; FAD6 86 01 LDA #$01 ; FAD8 B7 DFEA STA CTYPE ;solid cursor. FADB 86 04 LDA #$04 ; FADD B7 DFE1 STA ATTRI ; FAE0 8D BC BSR TEXT ;set text mode. FAE2 7D DFFA TST $DFFA ;cursor blanked ? FAE5 27 03 BEQ $FAEA ;no,skip. FAE7 BD FB47 JSR $FB47 ;yes,toggle it. FAEA 3596 PULS A,B,X,PC ; link text parameters FAEC 39 clink RTS ; init text mode Partitions FAED 8E CA00 LDX #$CA00 ;initialise text FAF0 1F10 TFR X,D ;mode Partition FAF2 108E 0120 LDY #$0120 ;parameters. FAF6 CE 0000 LDU #$0000 ; update Partitions FAF9 BF DFEC STX TS1 ; FAFC FD DFEE STD TS2 ; FAFF 10BF DFF0 STY TL1 ; FB03 FF DFF2 STU TL2 ; FB06 3402 PSHS A ; FB08 B6 DFCB LDA GMODE ; FB0B 85 09 BITA #$09 ;if text mode set, FB0D 27 02 BEQ $FB11 ;load these params, FB0F 3582 PULS A,PC ;else,return. FB11 3502 PULS A ; FB13 BD F6CE JSR SETPAR ; FB16 39 RTS ; send a char to video FB17 3476 PSHS A,B,X,Y,U ; FB19 BD F32F JSR FAST ; FB1C 7D DFFA TST $DFFA ;cursor blanked ? FB1F 27 02 BEQ $FB23 ;if so, FB21 8D 24 BSR $FB47 ;toggle it FB23 7D DFEB TST ESCFLG ;set ? FB26 27 05 BEQ $FB2D ;no,continue FB28 BD FC7B JSR $FC7B ;else,deal with it FB2B 20 15 BRA $FB42 ;and exit. FB2D 81 20 CMPA #$20 ;is it a control chr ? FB2F 1025 007F LBCS $FBB2 ;yes,go do it. FB33 84 7F ANDA #$7F ;else,make sure its FB35 8D 29 BSR $FB60 ;ascii & do it. FB37 B6 DFDA LDA COL ; FB3A 4C INCA ; FB3B 81 6C CMPA #$6C ;end of line ? FB3D 27 03 BEQ $FB42 ;yes,exit. FB3F B7 DFDA STA COL ;no,update col. FB42 BD F33C JSR SLOW ; FB45 35F6 PULS A,B,X,Y,U,PC ; flashing cursor FB47 3476 PSHS A,B,X,Y,U ; FB49 7D DFEA TST CTYPE ; FB4C 2B 10 BMI $FB5E ;cursor off,skip. FB4E 86 01 LDA #$01 ;(complement mode) FB50 BD F656 JSR SETPEN ; FB53 B6 DFEA LDA CTYPE ; FB56 8A 80 ORA #$80 ;adjust for use as index FB58 4A DECA ;to char table. FB59 8D 0D BSR $FB68 ;toggle cursor FB5B 73 DFFA COM $DFFA ;toggle 'blanked' flag. FB5E 35F6 PULS A,B,X,Y,U,PC ; deal with printable character. (7 bit ascii in ACCA). FB60 3406 PSHS A,B ; FB62 4F CLRA ;(replace mode) FB63 BD F656 JSR SETPEN ; FB66 3506 PULS A,B ;peek & put back FB68 3406 PSHS A,B ; FB6A 8D 1C BSR $FB88 ;adjust coordinates FB6C 80 20 SUBA #$20 ;use as index FB6E 8E FD15 LDX #$FD15 ;(char set,Normal) FB71 C6 05 LDB #$05 ;find character FB73 3D MUL ; FB74 30 8B LEAX D,X ; FB76 BD F66D JSR SETPAT ;set it up FB79 B6 DFE1 LDA ATTRI ; FB7C 108E 0005 LDY #$0005 ;pixels in init dir. FB80 8E 0008 LDX #$0008 ;pixels at Rt.Angles. FB83 BD F834 JSR FILL ;and print it FB86 3586 PULS A,B,PC ; convert coordinates,text to graphic. FB88 3436 PSHS A,B,X,Y ; FB8A B6 DFD9 LDA ROW ;row No. FB8D C6 0C LDB #$0C ;lines per row FB8F 3D MUL ; FB90 F3 DFF2 ADDD TL2 ;+ overwritten lines FB93 1F02 TFR D,Y ; FB95 108C 0120 CMPY #$0120 ;2nd time round ? FB99 2D 04 BLT $FB9F ;no,skip FB9B 31 A9FEE0 LEAY -$0120,Y ;yes,-len of T ram FB9F 31 A90248 LEAY $0248,Y ;+len of G ram FBA3 B6 DFDA LDA COL ; FBA6 C6 07 LDB #$07 ;(width of box col) FBA8 3D MUL ; FBA9 1F01 TFR D,X ; FBAB 30 0C LEAX $0C,X ;+initial offset FBAD BD F732 JSR SETCRG ; FBB0 35B6 PULS A,B,X,Y,PC ; deal with control character (entered from send char. to video). FBB7 48 LSLA ;char X 2 is used FBB8 AD 96 JSR [A,X] ;as index to table. FBBA 3516 PULS A,B,X ; FBBC 16 FF83 LBRA $FB42 ;return to sender. table of control code action routines. FBBF FDB $FBFF FBC1 FDB $FBFF FBC3 FDB $FBFF FBC5 FDB $FBFF FBC7 FDB $FBFF FBC9 FDB $FBFF FBCB FDB $FBFF FBCD FDB $FC00 bell FBCF FDB $FC03 c left FBD1 FDB $FC0D c right FBD3 FDB $FC19 c down FBD5 FDB $FC2B c up FBD7 FDB $FC3B clr.screen FBD9 FDB $FC41 CR FBDB FDB $FC7B move c FBDD FDB $FC3E home c FBDF FDB $FC45 scr.on FBE1 FDB $FC48 scr.off FBE3 FDB $FC54 c on FBE5 FDB $FC4B c off FBE7 FDB $FC5D solid c FBE9 FDB $FC63 box c FBEB FDB $FC69 attri.on FBED FDB $FC72 attri.off FBEF FDB $FBFF clr. to end of line FBF1 FDB $FBFF clr.to end of scr. FBF3 FDB $FC9D clr.line FBF5 FDB $FBFF FBF7 FDB $FBFF FBF9 FDB $FBFF FBFB FDB $FBFF FBFD FDB $FBFF FBFF 39 RTS FC00 7E F5F4 JUMP BEEP ; cursor left FC03 B6 DFDA LDA COL ; FC06 4A DECA ; FC07 2B 03 BMI $FC0C ;if fully left ignore FC09 B7 DFDA STA COL ; FC0C 39 RTS ; cursor right FC0D B6 DFDA LDA COL ; FC10 4C INCA ; FC11 81 6C CMPA #$6C ;if fully right, FC13 27 03 BEQ $FC18 ;skip FC15 B7 DFDA STA COL ; FC18 39 RTS ; cursor down FC19 B6 DFD9 LDA ROW ;get row. FC1C 4C INCA ; FC1D 81 18 CMPA #$18 ;24? (N.B. rows=0-23) FC1F 26 06 BNE $FC27 ; FC21 BD FCA0 JSR $FCA0 ;scroll up. FC24 7E FCEA JMP $FCEA ;clear line.(Btm). FC27 B7 DFD9 STA ROW ; FC2A 39 RTS ; cursor up FC2B B6 DFD9 LDA ROW ; FC2E 4A DECA ; FC2F 2A 06 BPL $FC37 ; FC31 BD FCBD JSR $FCBD ;scroll down FC34 7E FCEA JMP $FCEA ;clear line.(Top). FC37 B7 DFD9 STA ROW ; FC3A 39 RTS ; clear screen FC3B 7E FABC JMP CLEART ; home cursor FC3E 7F DFD9 CLR ROW ; carriage return FC41 7F DFDA CR CLR COL ; FC44 39 RTS ; screen on FC45 7E F7DF JMP $F7DF ; screen off FC48 7E F7D3 JMP $F7D3 ; cursor off FC4B B6 DFEA LDA CTYPE ; FC4E 8A 80 ORA #$80 ; FC50 B7 DFEA STA CTYPE ; FC53 39 RTS ; cursor on FC54 B6 DFEA LDA CTYPE ; FC57 84 7F ANDA #$7F ; FC59 B7 DFEA STA CTYPE ; FC5C 39 RTS ; solid cursor FC5D 86 01 LDA #$01 ; FC5F B7 DFEA STA CTYPE ; FC62 39 RTS ; box cursor FC63 86 02 LDA #$02 ; FC65 B7 DFEA STA CTYPE ; FC68 39 RTS ; attributes on FC69 B6 DFE1 LDA ATTRI ; FC6C 8A 81 ORA #$81 ; FC6E B7 DFE1 STA ATTRI ; FC71 39 RTS ; attributes off FC72 B6 DFE1 LDA ATTRI ; FC75 84 7E ANDA #$7E ; FC77 B7 DFE1 STA ATTRI ; FC7A 39 RTS ; move cursor. (3 pass escape sequence). FC7B F6 DFEB LDB ESCFLG ; FC7E 5D TSTB ;is it set ? FC7F 26 06 BNE $FC87 ;yes,branch FC81 C6 02 LDB #$02 ;no,set it FC83 F7 DFEB STB ESCFLG ; FC86 39 RTS ; FC87 C1 02 CMPB #$02 ;is it 2 ? FC89 26 09 BNE $FC94 ;no,branch FC8B 80 20 SUBA #$20 ;yes,update row. FC8D B7 DFD9 STA ROW ; FC90 7A DFEB DEC ESCFLG ; FC93 39 RTS ; FC94 80 20 SUBA #$20 ;update col and FC96 B7 DFDA STA COL ; FC99 7A DFEB DEC ESCFLG ;clear flag. FC9C 39 RTS ; clear line FC9D 7E FCEA JMP $FCEA ; scroll up. FCA0 10BE DFF0 LDY TL1 ;reduce TL1 by FCA4 31 34 LEAY -$0C,Y ;one row. FCA6 26 03 BNE $FCAB ; FCA8 16 FE42 LBRA $FAED ;init Part.params. FCAB FC DFEE LDD TS2 ; FCAE BE DFEC LDX TS1 ; FCB1 30 890240 LEAX $0240,X ;12 lines X 48 words ;(ie. advance 1 row) FCB5 FE DFF2 LDU TL2 ;increment TL2 by FCB8 33 4C LEAU $0C,U ;one row. FCBA 16 FE3C LBRA $FAF9 ;update Part.params. scroll down. FCBD FE DFF2 LDU TL2 ;if zero,apply FCC0 27 18 BEQ $FCDA ;cooking factor. FCC2 BE DFEC LDX TS1 ; FCC5 30 89FDC0 LEAX -$0240,X ;retreat one row. FCC9 FC DFEE LDD TS2 ; FCCC 10BE DFF0 LDY TL1 ;increase TL1 by FCD0 31 2C LEAY $0C,Y ;one row. FCD2 FE DFF2 LDU TL2 ;reduce TL2 by FCD5 33 54 LEAU -$0C,U ;one row. FCD7 16 FE1F LBRA $FAF9 ;update Part.params. FCDA 8E FDC0 LDX #$FDC0 ;TS1 FCDD CC CA00 LDD #$CA00 ;TS2 FCE0 108E 000C LDY #$000C ;TL1 (1 row) FCE4 CE 0114 LDU #$0114 ;TL2 (23 rows) FCE7 16 FE0F LBRA $FAF9 ;update Part.params. clear line FCEA 3436 PSHS A,B,X,Y ; FCEC FC DFD9 LDD ROW ; FCEF C6 0C LDB #$0C ;convert to lines FCF1 3D MUL ; FCF2 F3 DFF2 ADDD TL2 ;+overwritten lines FCF5 1F02 TFR D,Y ; FCF7 108C 0120 CMPY #$0120 ;2nd time round ? FCFB 2D 04 BLT $FD01 ;skip if not FCFD 31 A9FEE0 LEAY -$0120,Y ;-len of text ram FD01 31 A90240 LEAY $0240,Y ;+len of graphics ram FD05 8E 0000 LDX #$0000 ; FD08 BD F732 JSR SETCRG ;(to start of row) FD0B 8E 0240 LDX #$0240 ;clear one row. FD0E 86 02 LDA #$02 ; FD10 BD F875 JSR CLEARX ; FD13 35B6 PULS A,B,X,Y,PC ; character set 'Normal' FD15 00 00 NEG $00 ;