AS V1.42 Beta [Bld 32] - source file monitor.asm - page 1 - 6/3/2005 1:23:28 1/ 0 : cpu z80 2/ 0 : 3/ 0 : shared porta 4/ 0 : shared portb 5/ 0 : shared portc 6/ 0 : shared portcmd 7/ 0 : shared ramtop 8/ 0 : 9/ 0 : =FCH porta equ 0fch 10/ 0 : =FDH portb equ 0fdh 11/ 0 : =FEH portc equ 0feh 12/ 0 : =FFH portcmd equ 0ffh 13/ 0 : =3C00H ramtop equ 03c00h 14/ 0 : =400H ramsize equ 1024 15/ 0 : =50H monitor_area equ 80 16/ 0 : =3FFFH ramend equ ramtop+ramsize-1 17/ 0 : =0H romtop equ 0 18/ 0 : 19/ 0 : shared port_led 20/ 0 : shared port_txd 21/ 0 : shared port_rxd 22/ 0 : =7H port_led equ 7 23/ 0 : =6H port_txd equ 6 24/ 0 : =3H port_rxd equ 3 25/ 0 : 26/ 3FB0 : org ramend - monitor_area +1 27/ 3FB0 : shared gets_buf_size 28/ 3FB0 : shared gets_buf 29/ 3FB0 : =30H gets_buf_size equ 48 30/ 3FB0 : gets_buf ds gets_buf_size 31/ 3FE0 : savepc ds 2 32/ 3FE2 : savesp ds 2 33/ 3FE4 : savehl ds 2 34/ 3FE6 : savede ds 2 35/ 3FE8 : savebc ds 2 36/ 3FEA : saveaf ds 2 37/ 3FEC : =3FECH saveaf_stack: equ $ 38/ 3FEC : ds 20 39/ 4000 : =4000H monitor_stack: equ $ 40/ 4000 : 41/ 4000 : ;8255 PORT-C ON/OFF Macro (18Clock) 42/ 4000 : ;Ex.PORTC 3,1(PORTC(6)=1) PORTC 7,0(PORT(7)=0) 43/ 4000 : PORTC MACRO arg1,arg2 44/ 4000 : ld a,arg2|(arg1<<1) 45/ 4000 : out (portcmd),a 46/ 4000 : ENDM 47/ 4000 : 48/ 0 : org romtop 49/ 0 : C3 CA 00 jp init 50/ 3 : 51/ 38 : int: org 38h 52/ 38 : C3 3B 00 jp debugger 53/ 3B : 54/ 3B : ;RST 38 55/ 3B : debugger: 56/ 3B : 22 E4 3F ld (savehl),hl ;save HL 57/ 3E : E3 ex (sp),hl 58/ 3F : 22 E0 3F ld (savepc),hl ;save PC via stack 59/ 42 : E3 ex (sp),hl 60/ 43 : F5 push af AS V1.42 Beta [Bld 32] - source file monitor.asm - page 2 - 6/3/2005 1:23:28 61/ 44 : 21 02 00 ld hl,2 62/ 47 : 39 add hl,sp 63/ 48 : 22 E2 3F ld (savesp),hl ;save SP 64/ 4B : F1 pop af 65/ 4C : 31 EC 3F ld sp,saveaf_stack 66/ 4F : F5 push af 67/ 50 : C5 push bc 68/ 51 : D5 push de 69/ 52 : 31 00 40 ld sp,monitor_stack 70/ 55 : ; any process 71/ 55 : CD 2D 03 call putsip 72/ 58 : 0D 0A 50 43 3A 00 db "\r\nPC:",0 73/ 5E : 2A E0 3F ld hl,(savepc) 74/ 61 : CD 3F 03 call hexword 75/ 64 : CD 2D 03 call putsip 76/ 67 : 20 53 50 3A 00 db " SP:",0 77/ 6C : 2A E2 3F ld hl,(savesp) 78/ 6F : CD 3F 03 call hexword 79/ 72 : CD 2D 03 call putsip 80/ 75 : 20 48 4C 3A 00 db " HL:",0 81/ 7A : 2A E4 3F ld hl,(savehl) 82/ 7D : CD 3F 03 call hexword 83/ 80 : CD 2D 03 call putsip 84/ 83 : 20 44 45 3A 00 db " DE:",0 85/ 88 : 2A E6 3F ld hl,(savede) 86/ 8B : CD 3F 03 call hexword 87/ 8E : CD 2D 03 call putsip 88/ 91 : 20 42 43 3A 00 db " BC:",0 89/ 96 : 2A E8 3F ld hl,(savebc) 90/ 99 : CD 3F 03 call hexword 91/ 9C : CD 2D 03 call putsip 92/ 9F : 20 41 46 3A 00 db " AF:",0 93/ A4 : 2A EA 3F ld hl,(saveaf) 94/ A7 : CD 3F 03 call hexword 95/ AA : CD 08 03 $$loop call conin ;break any-key 96/ AD : C2 AA 00 jp nz,$$loop 97/ B0 : 79 ld a,c 98/ B1 : FE 03 cp 3 ;Ctrl-C 99/ B3 : CA 00 00 jp z,0 ;Reboot 100/ B6 : 21 63 01 ld hl,crlf 101/ B9 : CD 34 03 call puts 102/ BC : ; go-back 103/ BC : 31 E6 3F ld sp,savede 104/ BF : D1 pop de 105/ C0 : C1 pop bc 106/ C1 : F1 pop af 107/ C2 : 2A E2 3F ld hl,(savesp) 108/ C5 : F9 ld sp,hl 109/ C6 : 2A E4 3F ld hl,(savehl) 110/ C9 : C9 ret 111/ CA : 112/ CA : init: 113/ CA : 31 B0 3F ld sp,ramend-monitor_area+1 114/ CD : 3E 81 ld a,010000001b ;8255 Mode0 A=OUT,B=OUT,C(HIGH)=OUT,C(LOW)=IN 115/ CF : D3 FF out (portcmd),a 116/ D1 : (MACRO) PORTC port_txd,1 ;TxD STOP-BIT 116/ D1 : 3E 0D ld a,1|(PORT_TXD<<1) 116/ D3 : D3 FF out (portcmd),a 117/ D5 : 118/ D5 : main: AS V1.42 Beta [Bld 32] - source file monitor.asm - page 3 - 6/3/2005 1:23:28 119/ D5 : CD 9E 03 call delay 120/ D8 : 21 3E 01 ld hl,msg_clear 121/ DB : CD 34 03 call puts 122/ DE : 21 46 01 ld hl,msg_hello 123/ E1 : CD 34 03 call puts 124/ E4 : 21 D0 03 ld hl,copyright 125/ E7 : CD 34 03 call puts 126/ EA : 127/ EA : shared monitor 128/ EA : monitor: 129/ EA : 0E 3E ld c,'>' 130/ EC : CD 6D 03 call conout ;prompt 131/ EF : CD 40 02 call gets 132/ F2 : 3A B0 3F ld a,(gets_buf) 133/ F5 : 47 ld b,a ;B=First String 134/ F6 : 21 66 01 ld hl,cmdtbl 135/ F9 : 7E $$find ld a,(hl) 136/ FA : A7 and a 137/ FB : CA 18 01 jp z,$$error 138/ FE : B8 cp b 139/ FF : CA 08 01 jp z,$$go 140/ 102 : 23 inc hl 141/ 103 : 23 inc hl 142/ 104 : 23 inc hl 143/ 105 : C3 F9 00 jp $$find 144/ 108 : 11 EA 00 $$go ld de,monitor 145/ 10B : D5 push de ;set monitor return address 146/ 10C : 23 inc hl 147/ 10D : 5E ld e,(hl) 148/ 10E : 23 inc hl 149/ 10F : 56 ld d,(hl) 150/ 110 : D5 push de ;set command table address 151/ 111 : 21 B1 3F ld hl,gets_buf+1 ;set HL=argument pointer 152/ 114 : CD 2E 02 call skipspace 153/ 117 : C9 ret 154/ 118 : 0E 3F $$error ld c,'?' 155/ 11A : CD 6D 03 call conout 156/ 11D : 21 63 01 ld hl,crlf 157/ 120 : CD 34 03 call puts 158/ 123 : C3 EA 00 jp monitor 159/ 126 : 160/ 126 : 161/ 126 : conin_conout_loopback_test: 162/ 126 : (MACRO) PORTC port_led,0 162/ 126 : 3E 0E ld a,0|(PORT_LED<<1) 162/ 128 : D3 FF out (portcmd),a 163/ 12A : CD 08 03 call conin 164/ 12D : 20 F7 jr nz,conin_conout_loopback_test 165/ 12F : (MACRO) PORTC port_led,1 165/ 12F : 3E 0F ld a,1|(PORT_LED<<1) 165/ 131 : D3 FF out (portcmd),a 166/ 133 : 79 ld a,c 167/ 134 : CD 48 03 call hexout 168/ 137 : 0E 20 ld c,' ' 169/ 139 : CD 6D 03 call conout 170/ 13C : 18 E8 jr conin_conout_loopback_test 171/ 13E : 172/ 13E : shared msg_clear 173/ 13E : shared msg_hello 174/ 13E : shared crlf AS V1.42 Beta [Bld 32] - source file monitor.asm - page 4 - 6/3/2005 1:23:28 175/ 13E : 07 1B 5B 48 1B 5B msg_clear: db "\a",01bh,"[H",01bh,"[J",0 4A 00 176/ 146 : 5A 2D 38 30 20 53 msg_hello: db "Z-80 SINGLE BOARD COMPUTER\r\n",0 49 4E 47 4C 45 20 42 4F 41 52 44 20 43 4F 4D 50 55 54 45 52 0D 0A 00 177/ 163 : 0D 0A 00 crlf: db "\r\n",0 178/ 166 : 179/ 166 : ;command table 180/ 166 : cmdtbl: 181/ 166 : 44 db 'D' 182/ 167 : 73 01 dw c_dump 183/ 169 : 47 db 'G' 184/ 16A : 8B 01 dw c_go 185/ 16C : 57 db 'W' 186/ 16D : 9B 01 dw c_write 187/ 16F : 46 db 'F' 188/ 170 : D9 01 dw c_full 189/ 172 : 00 db 0 190/ 173 : 191/ 173 : c_dump: 192/ 173 : CD ED 01 call str2bin 193/ 176 : D5 push de 194/ 177 : CD 2E 02 call skipspace 195/ 17A : CD ED 01 call str2bin 196/ 17D : E1 pop hl ;HL=start address, DE=end address 197/ 17E : ; ld de,07ffh 198/ 17E : D5 $$loop push de 199/ 17F : CD C6 02 call hexdump 200/ 182 : D1 pop de 201/ 183 : 7B ld a,e 202/ 184 : 95 sub a,l 203/ 185 : 7A ld a,d 204/ 186 : 9C sbc a,h 205/ 187 : D2 7E 01 jp nc,$$loop 206/ 18A : C9 ret 207/ 18B : 208/ 18B : c_go: 209/ 18B : 11 94 01 ld de,$$ret 210/ 18E : D5 push de ;set return address 211/ 18F : CD ED 01 call str2bin 212/ 192 : D5 push de ;set jump address 213/ 193 : C9 ret 214/ 194 : 21 63 01 $$ret ld hl,crlf 215/ 197 : CD 34 03 call puts 216/ 19A : C9 ret 217/ 19B : 218/ 19B : c_write: 219/ 19B : CD ED 01 call str2bin 220/ 19E : D5 push de 221/ 19F : E1 pop hl ;HL=target address 222/ 1A0 : CD 3F 03 $$loop call hexword 223/ 1A3 : 0E 3A ld c,':' 224/ 1A5 : CD 6D 03 call conout 225/ 1A8 : 7E ld a,(hl) 226/ 1A9 : CD 48 03 call hexout 227/ 1AC : E5 push hl 228/ 1AD : CD 2D 03 call putsip 229/ 1B0 : 20 2D 20 00 db " - ",0 AS V1.42 Beta [Bld 32] - source file monitor.asm - page 5 - 6/3/2005 1:23:28 230/ 1B4 : CD 40 02 call gets 231/ 1B7 : 21 B0 3F ld hl,gets_buf 232/ 1BA : CD 2E 02 call skipspace 233/ 1BD : 7E ld a,(hl) 234/ 1BE : A7 and a ;only CR 235/ 1BF : CA D4 01 jp z,$$skip 236/ 1C2 : CD 16 02 call ishex 237/ 1C5 : DA D2 01 jp c,$$error 238/ 1C8 : CD ED 01 call str2bin 239/ 1CB : 7B ld a,e 240/ 1CC : E1 pop hl 241/ 1CD : 77 ld (hl),a 242/ 1CE : 23 inc hl 243/ 1CF : C3 A0 01 jp $$loop 244/ 1D2 : E1 $$error pop hl 245/ 1D3 : C9 ret 246/ 1D4 : E1 $$skip pop hl 247/ 1D5 : 23 inc hl 248/ 1D6 : C3 A0 01 jp $$loop 249/ 1D9 : 250/ 1D9 : ;filled memory and cold start 251/ 1D9 : c_full: 252/ 1D9 : 21 00 3C ld hl,ramtop 253/ 1DC : 11 FF 3F ld de,ramend 254/ 1DF : 36 AA $$loop ld (hl),0aah 255/ 1E1 : 23 inc hl 256/ 1E2 : 7B ld a,e 257/ 1E3 : 7D ld a,l 258/ 1E4 : 95 sub l 259/ 1E5 : 7A ld a,d 260/ 1E6 : 9C sbc a,h 261/ 1E7 : D2 DF 01 jp nc,$$loop ;HL <= DE ? 262/ 1EA : C3 00 00 jp 0 263/ 1ED : 264/ 1ED : ;str2bin IN:HL(WORK POINTER) OUT:DE,HL(NEXT POINTER) 265/ 1ED : ;broken reg: A,B 266/ 1ED : shared str2bin ;IN=HL,OUT=DE,HL(NEXT) USE:A,B 267/ 1ED : str2bin: 268/ 1ED : 11 00 00 ld de,0 269/ 1F0 : 7E $$loop ld a,(hl) 270/ 1F1 : CD 16 02 call ishex ;check HEX-CHARACTOR 271/ 1F4 : D8 ret c 272/ 1F5 : 06 04 ld b,4 ;SHIFT LEFT DE-REGISTER 273/ 1F7 : 7B $$shift ld a,e 274/ 1F8 : A7 and a 275/ 1F9 : 17 rla 276/ 1FA : 5F ld e,a 277/ 1FB : 7A ld a,d 278/ 1FC : 17 rla 279/ 1FD : 57 ld d,a 280/ 1FE : 10 F7 djnz $$shift 281/ 200 : 7E ld a,(hl) 282/ 201 : CD 16 02 call ishex 283/ 204 : B3 or e 284/ 205 : 5F ld e,a 285/ 206 : 23 inc hl 286/ 207 : C3 F0 01 jp $$loop 287/ 20A : 288/ 20A : ;toupper IN:A OUT:A 289/ 20A : ;broken reg: B AS V1.42 Beta [Bld 32] - source file monitor.asm - page 6 - 6/3/2005 1:23:28 290/ 20A : shared toupper ;IN:A OUT:A USE:B 291/ 20A : toupper: 292/ 20A : 47 ld b,a 293/ 20B : D6 61 sub a,'a' ;A < 'a'? 294/ 20D : 78 ld a,b 295/ 20E : D8 ret c 296/ 20F : D6 79 sub a,'z'-1 ;A > 'z'? 297/ 211 : 78 ld a,b 298/ 212 : D0 ret nc 299/ 213 : D6 20 sub a,'a'-'A' 300/ 215 : C9 ret 301/ 216 : 302/ 216 : ;ishex IN:A OUT:['0'-'9''A'-'Z']=CY=0 else CY=1 A=Binary(00-0fh) 303/ 216 : ;broken reg: B 304/ 216 : shared ishex ;IN:A OUT:A USE:B ERR:CY=1 305/ 216 : ishex: 306/ 216 : D6 30 sub a,'0' 307/ 218 : D8 ret c ;lower than '0' 308/ 219 : FE 0A cp 10 309/ 21B : D2 20 02 jp nc,$$next 310/ 21E : A7 and a ;0-9,CY=0,RET 311/ 21F : C9 ret 312/ 220 : D6 07 $$next sub a,'A'-'9'-1 313/ 222 : FE 0A cp 10 314/ 224 : D8 ret c ;lower than 'A' 315/ 225 : FE 10 cp a,16 316/ 227 : D2 2C 02 jp nc,$$over 317/ 22A : A7 and a ;A-F,CY=0,RET 318/ 22B : C9 ret 319/ 22C : 37 $$over scf 320/ 22D : C9 ret 321/ 22E : 322/ 22E : ;skip white space 323/ 22E : ;IN=HL(work area) OUT:HL(NEXT POINTER) 324/ 22E : ;broken reg: A 325/ 22E : shared skipspace ;IN:HL OUT:HL USE:A 326/ 22E : skipspace: 327/ 22E : 7E ld a,(hl) 328/ 22F : A7 and a 329/ 230 : C8 ret z 330/ 231 : FE 20 cp ' ' 331/ 233 : CA 3C 02 jp z,$$skip 332/ 236 : FE 09 cp '\t' 333/ 238 : CA 3C 02 jp z,$$skip 334/ 23B : C9 ret 335/ 23C : 23 $$skip inc hl 336/ 23D : C3 2E 02 jp skipspace 337/ 240 : 338/ 240 : ;get console string zero terminated 339/ 240 : ;broken reg: A,B,C,D,E,H,L 340/ 240 : shared gets ;USE:A,B,C,D,E,H,L 341/ 240 : gets: 342/ 240 : 16 00 ld d,0 ;D=len 343/ 242 : 21 B0 3F ld hl,gets_buf 344/ 245 : 1E 01 $$init ld e,1 ;E=ECHO FLAG 345/ 247 : D5 $$keyin push de ;c=conin() 346/ 248 : CD 08 03 call conin 347/ 24B : D1 pop de 348/ 24C : C2 47 02 jp nz,$$keyin 349/ 24F : 79 ld a,c AS V1.42 Beta [Bld 32] - source file monitor.asm - page 7 - 6/3/2005 1:23:28 350/ 250 : FE 0D cp a,'\r' ;CR? 351/ 252 : C2 61 02 jp nz,$$lf 352/ 255 : 36 00 ld (hl),0 353/ 257 : 1C inc e 354/ 258 : 1D dec e 355/ 259 : C8 ret z ;echo mode is off? 356/ 25A : 21 63 01 ld hl,crlf 357/ 25D : CD 34 03 call puts 358/ 260 : C9 ret 359/ 261 : FE 0A $$lf cp a,'\n' ;LF? 360/ 263 : C2 72 02 jp nz,$$colon 361/ 266 : 36 00 ld (hl),0 362/ 268 : 1C inc e 363/ 269 : 1D dec e 364/ 26A : C8 ret z ;echo mode is off? 365/ 26B : 21 63 01 ld hl,crlf 366/ 26E : CD 34 03 call puts 367/ 271 : C9 ret 368/ 272 : FE 3A $$colon cp a,':' ;':'? 369/ 274 : C2 81 02 jp nz,$$bs 370/ 277 : 14 inc d 371/ 278 : 15 dec d 372/ 279 : C2 81 02 jp nz,$$bs ;first ':'? 373/ 27C : 1E 00 ld e,0 ;set echo mode is off 374/ 27E : C3 AB 02 jp $$proc 375/ 281 : FE 08 $$bs cp a,'\b' ;BS? 376/ 283 : C2 AB 02 jp nz,$$proc 377/ 286 : 7A ld a,d 378/ 287 : A7 and a 379/ 288 : CA 47 02 jp z,$$keyin ;empty? 380/ 28B : 2B dec hl 381/ 28C : 15 dec d 382/ 28D : 7B ld a,e 383/ 28E : 82 add a,d 384/ 28F : CA 45 02 jp z,$$init ;echo mode is off and delete, set echo mode is on 385/ 292 : 1C inc e 386/ 293 : 1D dec e 387/ 294 : CA 47 02 jp z,$$keyin ;echo mode is off? 388/ 297 : D5 push de 389/ 298 : 0E 08 ld c,'\b' ;RUB echo 390/ 29A : CD 6D 03 call conout 391/ 29D : 0E 20 ld c,' ' 392/ 29F : CD 6D 03 call conout 393/ 2A2 : 0E 08 ld c,'\b' 394/ 2A4 : CD 6D 03 call conout 395/ 2A7 : D1 pop de 396/ 2A8 : C3 47 02 jp $$keyin 397/ 2AB : 7A $$proc ld a,d 398/ 2AC : FE 2F cp a,gets_buf_size-1 399/ 2AE : D2 47 02 jp nc,$$keyin ;buffer last one? 400/ 2B1 : ; ld (hl),0 401/ 2B1 : ; ld hl,crlf 402/ 2B1 : ; call puts 403/ 2B1 : ; ret 404/ 2B1 : 79 ld a,c 405/ 2B2 : CD 0A 02 call toupper 406/ 2B5 : 77 ld (hl),a ;set buffer 407/ 2B6 : 23 inc hl 408/ 2B7 : 14 inc d 409/ 2B8 : 1C inc e AS V1.42 Beta [Bld 32] - source file monitor.asm - page 8 - 6/3/2005 1:23:28 410/ 2B9 : 1D dec e 411/ 2BA : CA 47 02 jp z,$$keyin ;echo mode is off? 412/ 2BD : D5 push de ;echo 413/ 2BE : 4F ld c,a 414/ 2BF : CD 6D 03 call conout 415/ 2C2 : D1 pop de 416/ 2C3 : C3 47 02 jp $$keyin 417/ 2C6 : 418/ 2C6 : ;hex dump INPUT HL(ADDRESS) 419/ 2C6 : ;broken reg: A,B,C,D HL=Next Address 420/ 2C6 : shared hexdump ;IN:HL OUT:HL USE:A,B,C,D 421/ 2C6 : hexdump: 422/ 2C6 : CD 3F 03 call hexword 423/ 2C9 : 0E 20 ld c,' ' 424/ 2CB : CD 6D 03 call conout 425/ 2CE : E5 push hl 426/ 2CF : 7E $$hex ld a,(hl) 427/ 2D0 : CD 48 03 call hexout 428/ 2D3 : 0E 20 ld c,' ' 429/ 2D5 : CD 6D 03 call conout 430/ 2D8 : 23 inc hl 431/ 2D9 : 7D ld a,l 432/ 2DA : E6 0F and 0fh 433/ 2DC : C2 CF 02 jp nz,$$hex 434/ 2DF : E1 pop hl 435/ 2E0 : 0E 20 ld c,' ' 436/ 2E2 : CD 6D 03 call conout 437/ 2E5 : 0E 2E $$asc ld c,'.' ;non ascii code. 438/ 2E7 : 7E ld a,(hl) 439/ 2E8 : FE 20 cp a,' ' 440/ 2EA : DA F3 02 jp c,$$dot ;non ascii 441/ 2ED : C6 00 add a,0 442/ 2EF : FA F3 02 jp m,$$dot ;non ascii 443/ 2F2 : 4F ld c,a 444/ 2F3 : CD 6D 03 $$dot call conout 445/ 2F6 : 23 inc hl 446/ 2F7 : 7D ld a,l 447/ 2F8 : E6 0F and 0fh 448/ 2FA : C2 E5 02 jp nz,$$asc 449/ 2FD : 0E 0D ld c,'\r' 450/ 2FF : CD 6D 03 call conout 451/ 302 : 0E 0A ld c,'\n' 452/ 304 : CD 6D 03 call conout 453/ 307 : C9 ret 454/ 308 : 455/ 308 : 456/ 308 : ;Serial INPUT RET=C (ZF=0 non input) 457/ 308 : ;1/9600 = 104.2us = 260.5Clock(2.5MHz-Z80) 458/ 308 : ;Broken reg:A,B,D 459/ 308 : shared conin ;RET:C USE:A,B,D 460/ 308 : conin: 461/ 308 : DB FE in a,(portc) 462/ 30A : E6 08 and 1< TxD(LED) LoopBack Test 578/ 3A8 : port_loopback_test: 579/ 3A8 : DB FE in a,(portc) 580/ 3AA : E6 08 and 1<